我试图在另一个类的构造函数中分配一个类的成员。但是我收到的错误是“因为成员是私人的而无法分配”。 代码是这样的:
Class Class1 {
private:
string name;
string city;
}
Class Class2 {
private:
string id;
string age;
Class1 var; //Class1 type variable defined.
Public:
Class2(){ // Now I will define constructor.
}
Class2(Class1&, string name1, string city1) {
var.name = name1; // error reported , class1 private member
var.city = city1; // error reported , class1 private member
}
}
答案 0 :(得分:1)
首先,让我们解决一些简单的问题。您正在使用Class Class1 { ... }
定义一个类,它应该是class Class1 { ... };
。也就是说,关键字是class
,您需要用分号结束定义。此外,Class2
构造函数的第一个参数类型为Class1&
,但您甚至不使用它。你在这里传递的任何Class1
都会被浪费掉。
在您的示例中,var
属于Class1
类型,是Class2
的成员。这不会给Class2
任何特殊的权限,以便能够访问Class1
个私人成员。它们是完全私密的。
在你的标题中,你说你是压倒性的构造函数。覆盖仅适用于类继承。从另一个继承的类可以覆盖其成员函数。所以现在,还不清楚你是否希望Class1
成为基类或Class2
的成员。
如果您正在寻找继承,则应将Class2
的声明更改为class Class2 : public Class1 { ... };
。这意味着Class2
继承自Class1
。您仍然无法访问Class1
的成员,因为它们是私有的。要使它们可用于派生类,您需要将它们设为protected
或public
- 前者是首选。
class Class1 {
protected:
Class1(string name, string city) : name(name), city(city) { }
string name;
string city;
};
class Class2 : public Class1 {
private:
string id;
string age;
public:
Class2(string name1, string city1)
: Class1(name1, city1)
{ }
};
如果您想要合成 - 也就是说,Class1
是Class2
的成员 - 那么您需要以Class2
某种方式设置Class1
的成员。目前,其成员是私人的,所以你不能做任何事情。您可以制作public
,但非常气馁。一种更好的方法是在setName
中提供允许setCity
执行的公开Class1
和Class2
功能:
var.setName(name1);
var.setCity(city1);
更好的是,因为我倾向于认为为了它而制作setter是非常糟糕的设计,你应该给Class
一个构造函数来设置名称和城市并在{{1}中初始化var
初始化列表:
Class1
答案 1 :(得分:1)
您无法从class2为class1的私有成员赋值。
我会在类1中创建一个构造函数,用于初始化变量name和city:
Class1(string n, string c)
{
name=n;
city=c;
}
然后在class2构造函数中,我将调用该构造函数,如下所示:
Class2(Class1&, string name1, string city1)
{
var = Class1(name1,city1);
}
根据您的代码段,我建议的最好。
答案 2 :(得分:1)
如另一个答案中所述,您可以使用构造函数初始化类1的变量:
现在要获取值,你应该在第1课中做这样的事情:
public string getName()
{
return name;
}
public string getCity()
{
return city;
}
将这两个函数添加到class1: 然后在class2中,您可以通过调用它们来获取城市的值:
var.getCity();
或
var.getName();
这些将使您可以访问class2中的class1变量。
答案 3 :(得分:0)
正如您的编译器告诉您的名称和城市是Class1的私有,因此只能从第二类中访问。
使用名称和城市的唯一方法是将Ctor添加到以名称和城市作为参数的Class1,然后提供(公共)方法(getters / setters)以获取这些值并设置这些值。
答案 4 :(得分:0)
您不能在该类之外设置私有成员变量。
尝试受保护(如果您正在使用继承),公共(简单的出路),或(最好的!)创建setter和getter函数,并将这些函数公开。
简单(实际上过度简化)您希望所有变量都是私有的,而某些函数是公共的。每个变量都需要一个setter和getter函数,如果它是私有的,你想在类之外调用它。
答案 5 :(得分:0)
正如其他人所说,您无法从其他(非朋友)类型访问某个类型的私有成员。如初。
此外,您是两阶段初始化您的var
成员,似乎完全没必要。写一个合适的构造函数
Class1::Class1(std::string const& name, std::string const& city)
: name(name), city(city) {
}
并从Class2
:
// what is that first parameter for?
Class2(Class1&, string name, string city)
: var(name,city) {
}
您可以将Class1
的构造函数设为公开,也可以将其设为私有,并明确地与Class2
成为朋友。