过度使用的构造函数

时间:2012-11-23 20:02:02

标签: c++

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

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
        }
}

6 个答案:

答案 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的成员,因为它们是私有的。要使它们可用于派生类,您需要将它们设为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)
    { }
};

如果您想要合成 - 也就是说,Class1Class2的成员 - 那么您需要以Class2某种方式设置Class1的成员。目前,其成员是私人的,所以你不能做任何事情。您可以制作public,但非常气馁。一种更好的方法是在setName中提供允许setCity执行的公开Class1Class2功能:

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函数,如果它是私有的,你想在类之外调用它。

http://www.cplusplus.com/forum/beginner/70937/

答案 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成为朋友。