【问题标题】:How to use default constructor while using composition? in visual studio使用组合时如何使用默认构造函数?在视觉工作室
【发布时间】:2021-04-21 23:38:18
【问题描述】:

当我在 main 中声明 Game 对象时,我不断收到://C2512:没有合适的默认构造函数可用,我正在使用 Visual Studio,在其他编译器上,错误并不总是出现。

我试图改变定义和初始化的方式,但它一直给我同样的错误,就像考试中的一个问题是有默认的参数化构造函数,其中一个参数是组合中的另一个类对象,但我在代码中这样做它给了我上面的错误

那么在使用组合时如何使用默认构造函数???

#include <iostream>
#include <string>
//#include "Game.h"
//#include "Screen.h"
using namespace std;


class Screen
{
private:
    int resolution;
    int brightness;
    string color;
public:
    Screen(int br = 20, int rl = 10, string colr = "green");
};

Screen::Screen(int br, int rl, string colr) :resolution(rl), brightness(br), color(colr)  {}



class Game {
protected:
    string name;
    Screen screen1;
public:
    Game(Screen& ok, string nam = "minecraft");
};


Game::Game(Screen& ok, string nam) : screen1(ok), name(nam)
{ }



int main()
{
    //Screen screen1;
    Game gg;




    return 0;
}

//screen1 = ok;


【问题讨论】:

  • Screen() = default; 添加到您的类定义中?
  • 还有其他方法吗?
  • 当然:Screen() {} 也可以。或者在创建Screen 实例时传递所需的构造函数参数。
  • 如果没有默认构造函数,则不能调用默认构造函数,因为不存在。您是否尝试过为gg 对象调用main 中的可用构造函数?
  • 您应该在创建gg 时传递Screen 实例。

标签: c++ visual-c++ constructor default-constructor


【解决方案1】:
    Game(string nam = "minecraft") : screen1(Screen()), name(nam) {}

screen1(Screen()) 使用默认参数创建一个 Screen 对象并分配给 screen1。

整个程序:

#include <iostream>
#include <string>
//#include "Game.h"
//#include "Screen.h"
using namespace std;


class Screen
{
private:
    int resolution;
    int brightness;
    string color;
public:
    Screen(int br = 20, int rl = 10, string colr = "green"):resolution(rl), brightness(br), color(colr)  {}
};


class Game {

public:
    Game(string nam = "minecraft") : screen1(Screen()), name(nam) {}

protected:

    Screen screen1;
    string name;
};


int main()
{
    //Screen screen1;
    Game gg;

    return 0;
}

【讨论】:

  • 它适用于我...我粘贴了整个程序。
  • 成功了!! ,有没有办法向它发送任何参数?从主要方面,我如何将 `Game(string nam = "minecraft") : screen1(Screen()), name(nam) {}` 拆分为头文件和 .cpp 文件
  • 然后更改为 Game(Screen s =Screen(), string nam = "minecraft") : screen1(s), name(nam) {}。您可以将构造函数定义留在标题中。
【解决方案2】:

构造器Game(Screen&amp; ok, string nam = "minecraft"); 需要获得对Screen 对象的引用。

当你像这样创建Game 对象时: Game gg;

没有对 Screen 对象的引用。

构造调用的一个很好的例子是:

Screen s;
Game gg(s);

其他技巧是将实现放在其他文件或您声明它的位置。 所以

Screen::Screen(int br, int rl, string colr) :resolution(rl), brightness(br), color(colr) {}

Screen(int br = 20, int rl = 10, string colr = "green"); 应该是:

Screen(int br = 20, int rl = 10, string colr = "green") 
    :resolution(rl), brightness(br), color(colr)  {}

【讨论】:

  • 第一个解决方案确实有效,但这不会改变它的默认值吗?关于提示,代码在头文件和.cpp文件之间,博士告诉我们将:resolution(rl), brightness(br), color(colr) 放在.cpp文件而不是头文件中,是真的吗?
  • 是的,通常代码会转到.cpp 文件,而声明会转到头文件 (.hpp)。但是,如果您只使用头文件(如 Templated 类 的情况),您将只使用头文件。另外,为什么第一个解决方案不起作用?
猜你喜欢
  • 1970-01-01
  • 2011-05-13
  • 1970-01-01
  • 1970-01-01
  • 2017-09-26
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多