过度施工

Over-ridden Constructors

本文关键字:施工      更新时间:2023-10-16

我试图在另一个类的构造函数中分配一个类成员。但我收到一个错误,"无法分配,因为成员是私人的。"代码是这样的:

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的成员,因为它们是私有的。为了使它们可用于派生类,您需要使它们成为protectedpublic——前者是首选。

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,也就是说,Class1Class2的成员,那么你需要给Class2一些方法来设置Class1的成员。目前,它的成员是私人的,所以你什么都不能做。您可以使它们成为public,但这将是非常不鼓励的。一种更好的方法是在Class1中提供公共setNamesetCity函数,允许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成为好友。