C ++中的Setter getter方法

时间:2015-12-12 09:01:20

标签: c++ setter getter

我是c ++的新手。我创建了以下类Into,MyWstring,如下所示:我尝试为setInto方法创建一个对象变量的setter。它抱怨没有这样的构造函数Into()。我该怎么办?如何为此创建setter? (基本上我的期望是如何在C ++中实现像setter这样的Java)

Into.h

#ifndef INTO_H_
#define INTO_H_

class Into {
public:
    Into(int id1);
    virtual ~Into();

    int id;
};

#endif /* INTO_H_ */

Into.cpp

#include "Into.h"

Into::Into(int id1) {
    // TODO Auto-generated constructor stub
    id = id1;
}

Into::~Into() {
    // TODO Auto-generated destructor stub
}

MyWstring.h

#ifndef MYWSTRING_H_
#define MYWSTRING_H_

#include<iostream>
#include"Into.h"

using namespace std;

class MyWstring {
public:
    MyWstring(wstring test1);
    virtual ~MyWstring();
    void assign(MyWstring m);
    void setInto(Into into1);

    wstring test;
    Into into;
};

#endif /* MYWSTRING_H_ */

MyWstring.cpp

#include "MyWstring.h"

MyWstring::MyWstring(wstring test1) {
    test = test1;
}

MyWstring::~MyWstring() {
    // TODO Auto-generated destructor stub
}

void MyWstring::assign(MyWstring m)
{
    m.test = L"M";
}

void MyWstring::setInto(Into into1)
{
    into = into1;
}

4 个答案:

答案 0 :(得分:1)

您的类有一个实例变量N,它没有默认构造函数(一个没有参数)。

创建into时,需要创建MyWstring的实例,但不能这样做,因为它不知道如何操作。

解决方案1:Into提供默认构造函数

Into

解决方案2:class Into { [...] Into() : id(0) { } }; 的初始值设定项列表中提及into

MyWstring

请注意在初始值设定项列表中分配MyWstring::MyWstring(wstring test1) : test(test1), into(0) { } 的其他更改。否则它会被默认构造,然后被复制分配,这可能不是你想要的。

如果test没有合理的默认值,您可能需要重新考虑逻辑并使用指向into对象的指针(但请务必使用Into或类似的。)

答案 1 :(得分:1)

构造std::unique_ptr<>时,编译器将调用所有基类(你没有任何基础类)和子对象的构造函数。如果你没有提供一个参数,那么它会在没有参数的情况下调用构造函数 - 而且你没有参数。您的选择是:

提供默认构造函数:

MyWString

初始化.... Into(int id1); Into(); ... Into::Into() : id(0) {} // Always prefer to initialize rather than assign later

MyWString::into

答案 2 :(得分:0)

尝试将MyWstring c&#ttor定义更改为:

    MyWstring::MyWstring(wstring test1)
    :
    into( 0 ),
    test( test1 )
    {

    }

在类MyWstring中有一个类型为Into的变量,它没有默认的c&#tor;因此编译器无法自己实例化它。

如果你的MyWString类接受变量&#34;进入&#34;在c,以便您设置实际值,而不是设置一些默认值。

答案 3 :(得分:0)

编译器抱怨您没有默认构造函数。 调用默认构造函数时,在构造对象时不传递任何参数,例如

Into into;

如果您的类是另一个类的成员,也会自动调用默认构造函数。

如果没有用户声明的构造函数,则自动生成默认构造函数。在您的情况下,您有构造函数Into(int id1),它阻止编译器自动生成默认构造函数。

所以你需要的是以下三行之一

Into():id(0){};
Into() = default; // C++11 syntax
Into():Into(0){}; // call another constructor from your constructor.

或者,如果你有一个构造函数,其所有参数都有默认值,编译器将使用它作为默认构造函数。所以你也可以这样做

Into(int _id = 0) : id(_id){};

如果您不想要类的默认构造函数,那么您需要在其他类的构造函数上调用非默认构造函数。

MyWstring::MyWstring(wstring test1): test(test1), into(0) 
{}

现在转到下一部分,您将类型Into的对象分配给同一类型的另一个对象,这意味着此处使用了复制赋值运算符。您很幸运,因为在您的情况下,编译器会自动生成复制赋值运算符。