Setter getter C++ 中的方法
Setter getter methods in C++
我是 C++ 新手。我创建了以下 类 Into, MyWstring 如下: 我试图为一个对象变量创建 setter 作为 setInto 方法。它抱怨没有这样的构造函数 Into()。我应该怎么办?如何为此创建 setter? (基本上我的期望是如何在 C++ 中实现 Java 就像 setters)
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;
}
尝试将您的 MyWstring c'tor 定义更改为:
MyWstring::MyWstring(wstring test1)
:
into( 0 ),
test( test1 )
{
}
您在 class MyWstring 中有一个类型为 Into 的变量,它没有默认的 c'tor,因此编译器无法自行实例化它。
此外,如果您的 MyWString class 接受 c'tor 中变量 "into" 的值,这样您就可以设置一个实际值,而不是设置一些默认值。
您的 class 有一个实例变量 into
,它没有默认构造函数(没有参数)。
创建MyWstring
时,需要创建Into
的实例,但无法创建,因为它不知道如何创建。
解决方案 1: 给 Into
一个默认构造函数
class Into {
[...]
Into() : id(0) { }
};
解决方案 2: 在 MyWstring
的初始化列表中提及 into
:
MyWstring::MyWstring(wstring test1)
: test(test1), into(0)
{
}
请注意在初始化列表中分配 test
的附加更改。否则它会被默认构造然后复制分配,这可能不是你想要的。
如果 into
没有合理的默认值,您可能需要重新考虑您的逻辑并改用指向 Into
对象的指针(但请确保使用 std::unique_ptr<>
或类似的)。
当你构造一个MyWString
时,编译器会调用所有基类(你没有)和子对象的构造函数。如果您不提供参数,它将调用不带参数的构造函数 - 而您没有参数。您的选择是:
提供默认构造函数:
....
Into(int id1);
Into();
...
Into::Into() : id(0) {} // Always prefer to initialize rather than assign later
初始化MyWString::into
:
MyWstring::MyWstring(wstring test1)
: test(test1)
, into(0)
{}
编译器抱怨您没有默认构造函数。
默认构造函数被调用,当你构造一个对象而不传递任何参数时,例如
Into into;
如果您的 class 是另一个 class 的成员,也会自动调用默认构造函数。
如果没有用户声明的构造函数,则自动生成默认构造函数。在您的情况下,您有构造函数 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){};
如果您不想要 class 的默认构造函数,那么您需要在另一个 class.
的构造函数上调用非默认构造函数
MyWstring::MyWstring(wstring test1): test(test1), into(0)
{}
现在进入下一部分,您将一个类型为 Into
的对象分配给另一个相同类型的对象,这意味着此处使用了复制赋值运算符。您很幸运,因为在您的情况下,编译器会自动生成复制赋值运算符。
我是 C++ 新手。我创建了以下 类 Into, MyWstring 如下: 我试图为一个对象变量创建 setter 作为 setInto 方法。它抱怨没有这样的构造函数 Into()。我应该怎么办?如何为此创建 setter? (基本上我的期望是如何在 C++ 中实现 Java 就像 setters)
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;
}
尝试将您的 MyWstring c'tor 定义更改为:
MyWstring::MyWstring(wstring test1)
:
into( 0 ),
test( test1 )
{
}
您在 class MyWstring 中有一个类型为 Into 的变量,它没有默认的 c'tor,因此编译器无法自行实例化它。
此外,如果您的 MyWString class 接受 c'tor 中变量 "into" 的值,这样您就可以设置一个实际值,而不是设置一些默认值。
您的 class 有一个实例变量 into
,它没有默认构造函数(没有参数)。
创建MyWstring
时,需要创建Into
的实例,但无法创建,因为它不知道如何创建。
解决方案 1: 给 Into
一个默认构造函数
class Into {
[...]
Into() : id(0) { }
};
解决方案 2: 在 MyWstring
的初始化列表中提及 into
:
MyWstring::MyWstring(wstring test1)
: test(test1), into(0)
{
}
请注意在初始化列表中分配 test
的附加更改。否则它会被默认构造然后复制分配,这可能不是你想要的。
如果 into
没有合理的默认值,您可能需要重新考虑您的逻辑并改用指向 Into
对象的指针(但请确保使用 std::unique_ptr<>
或类似的)。
当你构造一个MyWString
时,编译器会调用所有基类(你没有)和子对象的构造函数。如果您不提供参数,它将调用不带参数的构造函数 - 而您没有参数。您的选择是:
提供默认构造函数:
....
Into(int id1);
Into();
...
Into::Into() : id(0) {} // Always prefer to initialize rather than assign later
初始化MyWString::into
:
MyWstring::MyWstring(wstring test1)
: test(test1)
, into(0)
{}
编译器抱怨您没有默认构造函数。 默认构造函数被调用,当你构造一个对象而不传递任何参数时,例如
Into into;
如果您的 class 是另一个 class 的成员,也会自动调用默认构造函数。
如果没有用户声明的构造函数,则自动生成默认构造函数。在您的情况下,您有构造函数 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){};
如果您不想要 class 的默认构造函数,那么您需要在另一个 class.
的构造函数上调用非默认构造函数MyWstring::MyWstring(wstring test1): test(test1), into(0)
{}
现在进入下一部分,您将一个类型为 Into
的对象分配给另一个相同类型的对象,这意味着此处使用了复制赋值运算符。您很幸运,因为在您的情况下,编译器会自动生成复制赋值运算符。