【问题标题】:(Duplicated) C++ Classes set/get from base and derived class [duplicate]C ++类从基类和派生类设置/获取[重复]
【发布时间】:2017-10-20 03:28:02
【问题描述】:

我必须做什么?

我在创建两个集合(一个用于字符串字母,一个用于 int 数字)中创建一个基类,并在派生类(继承)中创建一个新集合(字符串名称),我想将它们组合在参数化构造函数中。

任何帮助都非常感谢,谢谢大家:)

这是我的代码示例:(在参数化构造函数中显示错误不起作用)

#include <iostream>
#include <string.h>

using namespace std;

class Code
{
   protected:
      string letter;
      int number;
   public:
      string getletter();
      int getnumber();
      void setletter(string letter1);
      void setnumber(int number1);
};

void Code::setletter(string letter1)
{
   letter=letter1;
}

void Code::setnumber(int number1)
{
   number=number1;
}

string Code::getletter()
{
   return letter;
}

int Code::getnumber()
{
   return number;
}

class Course : public Code
{
   private:
      string name;
   public:
      Course(string name1, string letter1, int number1);
      string getname();
      void show();  
};

Course::Course (string name1, string letter1,int number1) :
      setletter(letter1), setnumber(number1)    //Parameterized Constructor
{
   name=name1;
   letter=letter1;
   number=number1;
}

string Course::getname()
{
   return name;
}

void show()
{
   Course com("Object oriented programming","com",210);
   cout<<"Constructor >>>\n Course Name : "<< com.getname()<<"\n Course Code : "<< com.getletter() << com.getnumber()<<endl;
}

int main()
{
   show();
}

【问题讨论】:

  • :之后不能调用函数,只能初始化成员变量。将这些调用放入函数体中。
  • 简单的方法?向Code 添加一个构造函数,该构造函数设置Code 的成员,并使用传递给Course 构造函数的参数调用Course 构造函数的成员初始化器列表中的新构造函数。
  • 不管怎样,你对setletter(letter1)letter=letter1;不也是这样吗???
  • 请不要使用不会在公共成员变量上添加任何内容的 getter/setter 函数。指责 java 人认为这是一种有用的技术。

标签: c++ class inheritance visual-c++ constructor


【解决方案1】:

您可以在构造函数中调用它们

Course::Course (const string& name1, const string& letter1, const int number1) :
{
   name=name;
   setletter(letter1); // equivalent to letter=letter1 
   setnumber(number1);
}

您可以在代码类中添加构造函数

Code(const string& letter, const int number);

然后在你的 Course 构造函数中这样调用它

Course::Course(const string& name1, const string& letter1, const int number1) 
: Code(letter1, number1), name(name1)
{

}

但我不确定你的要求是什么,如果你能更准确地说明你想要什么,那就太好了,谢谢。

【讨论】:

  • “你不能在构造函数初始化列表中调用方法(或函数)。” 嗯??你再说一遍??这不是真的,您可以在那里调用函数来初始化任何成员变量。请不要再说这些了。
  • 你不能像那样初始化基类的成员。这不是法律代码。
【解决方案2】:

构造函数的参数列表后面的: 是“成员初始化器列表”。

Course::Course (string name1, string letter1,int number1)
: name(name1), letter(letter1), number(number1) {  }

【讨论】:

  • “你不能调用这个列表中的函数。” 嗯??这是完全错误的。你从哪里得到这种误解?
  • 很难说在哪里,但这样做有意义吗?
  • 当然有很多这样的用例。你的“答案”现在增加了什么价值?
  • 当然,这里是错误的地方,但我很感兴趣,真的。你能举个例子吗?
  • @πάνταῥεῖ 我的意思是你不要把函数调用放在那里——你可以在初始化器的值表达式中调用函数。
猜你喜欢
  • 2010-11-01
  • 2015-03-30
  • 1970-01-01
  • 2011-07-20
  • 1970-01-01
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
相关资源
最近更新 更多