2012-11-23 111 views
1

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

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

是的,'Class2'没有权力混淆'Class1'的私有成员。事实上,所讨论的Class1恰好是“Class2”的成员,这一点无关紧要。 (顺便提一下,很棒的类名。) – Beta

+0

不仅是Class Class1不是C++,但即使它是一个可怕的命名方案。任何人都可以看到这一点,并在一次会议中理解发生了什么?尝试选择简单,简短,*可区分*名称。 –

回答

1

您不能分配值到Class从Class2中的私有成员。

我将创建1类的构造函数,将初始化变量名称和城市:

Class1(string n, string c) 
{ 
name=n; 
city=c; 
} 

然后在Class2中的构造函数,我会说这就是构造函数如下:

Class2(Class1&, string name1, string city1) 
{ 
    var = Class1(name1,city1);   
} 

多数民众赞成在最好我可以根据你的代码片段提出建议。

+0

我不知道为什么我的代码仍然无法正常工作。给出argumetn 1需要的错误,提供了2 ...类似 – Terrenium

+0

DONE .....非常感谢.............. – Terrenium

+0

Sindhu ..现在,如果我想使一个必须返回Class2的Class1变量的函数。我会返回哪些参数,以便私人成员没有错误 – Terrenium

0

当你的编译器将告诉您的姓名和城市的私有方法的Class1之一,因此可以从两个类中唯一的访问。

使用name和city的唯一方法是将Ctor添加到以name和city作为参数的Class1,然后提供(public)方法(getters/setters)来获取这些值并设置这些值。

0

您不能在该类之外设置私有成员变量。

尝试受保护(如果您使用继承),公共(简单的出路)或(最好!)创建二传手和吸气功能,并使这些功能公开。

简单地(实际上过分简化)你希望所有变量都是私有的,并且有些函数是公开的。如果每个变量都是私有的,并且想要在类之外调用它,则每个变量都需要一个setter和getter函数。

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

+0

“如果每个变量都是私有的,那么每个变量都需要一个setter和getter函数”哦,现在这是一个巨大的泛化。 – Kos

+0

另外值得注意的是,你并不需要一个吸气定位器。如果两个类都紧密耦合,那么朋友指令也可以工作。 – Jack

+0

科斯:更新更具体。杰克:既然我们正在和初学者交谈,我想尽量保持简单。谢谢。 – Ted

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

+0

我仍然没有得到。你的语法对我来说太奇怪了。你可以请使用简单的语法与公共和私人类声明 我没有得到:name(name),city(city){} – Terrenium

+0

这是构造函数的成员初始化部分。这是很常见的语法。 – bitmask

+0

@ bitmask..Thanks很多.. – Terrenium

1

首先,让我们看看一些简单的问题。你使用Class Class1 { ... }来定义一个类,它应该是class Class1 { ... };。也就是说,关键字是class,您需要用分号结束定义。另外,你的Class2构造函数的第一个参数的类型是Class1&,但你甚至没有使用它。你在这里通过的任何Class1只会被浪费。

在您的例子,varClass1类型的,并且是一个构件的Class2。这不会给Class2任何特殊privilages访问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,但这将是高度不鼓励。一个更好的办法来做到这一点是提供公共setNamesetCity功能Class1允许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) 
    { } 
}; 
+0

很好...只是一件事。这个语法意味着什么:“:name(name),city(city)”.. ??? – Terrenium

+0

这是一个[初始化列表](http://www.learncpp.com/cpp-tutorial/101-constructor-initialization-lists/)。它使用构造函数参数'name'和'city'初始化成员'name'和'city'。他们恰好在这里被命名为相同,但更好的例子是'Class2'。在那里,我们用参数'name1'和'city1'初始化'var'。 –

1

作为另一个答案说,你可以使用构造函数初始化1类的变量:

我们得到的值,你应该做这样的事情在1类:

public string getName() 
{ 
return name; 
} 

public string getCity() 
{ 
return city; 
} 

添加这两个功能在您的Class1: 然后在Class2中,你可以通过得到城市的价值观打电话给他们:

var.getCity(); 

var.getName(); 

这些将使您访问class2中的class1变量。