【问题标题】:Subclass constructor not storing data for object子类构造函数不存储对象的数据
【发布时间】:2015-04-18 17:22:54
【问题描述】:

我正在尝试创建超类“条目”的子类,这些子类存储例如借来的图书馆物品的信息。使用我的 main 测试这些结果没有为“name”和“artist”返回任何值,但它确实为超类变量“borrowedBy”返回了一个值。我认为将它们放在构造函数中会将值传递给对象,但我似乎在某处犯了错误。 头文件:

#include <iostream>
#include <string>

class Entry{
private:
    int borrowed;
    std::string borrowedBy;
public:
    Entry();
    void printDetails();
    std::string getborrowedBy();
};

class MusicAlbum : public Entry{
private:
    std::string name;
    std::string artist;
public:
    void printDetails();
    MusicAlbum(std::string name, std::string artist);
    ~MusicAlbum();
    std::string getname();
};

cpp 文件:

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

MusicAlbum::MusicAlbum(std::string name, std::string artist){
    std::cout << "Constructor..." << std::endl;
    std::cout << "Name: " << name << std::endl;
    std::cout << "Artist: " << artist << std::endl << std::endl;
}

MusicAlbum::~MusicAlbum(){};

std::string MusicAlbum::getname(){
    return name;
};

std::string Entry::getborrowedBy(){
    return borrowedBy;
};

Entry::Entry(){
    borrowed = 1;
    borrowedBy = "test1";
};

void MusicAlbum::printDetails(){
    std::cout << "Printer..." << std::endl;
    std::cout << "Name: " << name << std::endl;
    std::cout << "Artist: " << artist << std::endl << std::endl;
}

int main(){
    MusicAlbum MA1("Name1", "Artist1");
    MA1.printDetails();
    std::cout << "getname: " << MA1.getname() << std::endl << std::endl;
    std::cout << "getborrowedby: " << MA1.getborrowedBy() << std::endl << std::endl;
    system("pause");
    return 0;
}

运行程序会得到以下结果:

Constructor...
Name: Name1
Artist: Artist1

Printer...
Name:
Artist:

getname:

getborrowedby: test1

因此,似乎正在存储来自“Entry”构造函数的信息,而不是来自“MusicAlbum”构造函数的信息。 其次,在定义一个新对象时,是否可以在保持私有的同时更改“borrowedBy”的值?它在 MusicAlbum 构造函数中是“不可访问的”。

【问题讨论】:

  • MusicAlbum 构造函数实际上并没有分配它的任何成员。它只是couts 一些东西。
  • 不会因为它们的名称相同而从参数中取出吗?
  • 不,他们不会。学习语言可能比猜测它是如何工作的更好。

标签: c++ oop inheritance subclass


【解决方案1】:

你必须改变你的构造函数来初始化你的类成员变量。由于变量的名称,不会自动完成任何操作:

MusicAlbum::MusicAlbum(std::string name, std::string artist) 
         : name(name), artist(artist) {
     ...
}

name(name) 表示使用参数name(内部名称)初始化类成员name(外部名称)。

请注意,此初始化列表还允许为基类指定参数。例如,如果你有一个基础构造函数:

Entry::Entry(std::string borrower) 
    :  borrowedBy(borrower), borrowed(1)
{ };

你也可以有一个派生的构造函数,比如:

MusicAlbum::MusicAlbum(std::string name, std::string artist, std::string bywhom) 
         : name(name), artist(artist), Entry (bywhom) {
     ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多