过度施工
Over-ridden Constructors
我试图在另一个类的构造函数中分配一个类成员。但我收到一个错误,"无法分配,因为成员是私人的。"代码是这样的:
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
}
}
不能从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);
}
这是我能根据您的代码片段提出的最好的建议。
首先,让我们解决一些简单的问题。您正在使用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)
{ }
};
如果你想要composition,也就是说,Class1
是Class2
的成员,那么你需要给Class2
一些方法来设置Class1
的成员。目前,它的成员是私人的,所以你什么都不能做。您可以使它们成为public
,但这将是非常不鼓励的。一种更好的方法是在Class1
中提供公共setName
和setCity
函数,允许Class2
执行
var.setName(name1);
var.setCity(city1);
更好的是,因为我倾向于认为为了它而制作setter是一个非常糟糕的设计,你应该给Class
一个构造函数,它设置名称和城市,并在Class1
的初始化器列表中初始化var
:
class Class1 {
public:
Class1(const string& name, const string& city)
: name(name), city(city)
{ }
private:
string name;
string city;
};
class Class2 {
private:
string id;
string age;
Class1 var;
public:
Class2(string name1, string city1)
: var(name1, city1)
{ }
};
正如在另一个答案中所说,您可以使用构造函数初始化类1:的变量
现在要获取值,您应该在类1:中执行类似的操作
public string getName()
{
return name;
}
public string getCity()
{
return city;
}
将这两个函数添加到类1中:然后在第2类中,你可以通过调用它们来获得城市的值:
var.getCity();
或
var.getName();
这将使您能够访问类2中的类1变量。
编译器告诉您的姓名和城市对于Class1 one是私有的,因此只能从class 2中访问。
使用name和city的唯一方法是向Class1添加一个Ctor,该Ctor以name和cities为参数,然后提供(公共)方法(getters/ssetters)来获取这些值并设置这些值。
不能在该类之外设置私有成员变量。
尝试protected(如果您使用继承)、public(简单的方法)或(迄今为止最好!)创建setter和getter函数,并将这些函数公开。
简单地(实际上过于简化了),您希望所有变量都是私有的,而某些函数是公共的。如果每个变量是私有的并且您想在类外调用它,那么它都需要一个setter和getter函数。
http://www.cplusplus.com/forum/beginner/70937/
正如其他人所说,您不能从另一个(非好友)类型访问某个类型的私有成员。曾经
此外,您正在对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
成为好友。
- 为什么 boost::interprocess::managed_shared_memory 在施工时会抛出 boost
- 施工期间的虚函数调用
- 施工后立即在向量上调用清晰?
- 安置回去在原地施工失败
- 施工中的自我参考
- 高效的施工委托
- C GRPC ::完整的施工速度约为14K
- 减少将临时对象分配给现场施工
- C 在施工中定义的容器
- 过度施工
- 在施工时预留的标准集装箱?
- 延期构件施工
- 超载*操作员只能与一个施工人员一起工作
- 如何在工厂设计中支持多个施工签名
- std::lock_guard<std::mutex> 施工上的段错误?
- 班级组成及施工顺序
- 委派施工人员
- Cin和施工方案
- 施工期间的非恒定发电机单程初始化
- 强制"in-place"施工