-1

I am new to C++ and working on a project where I have array of instances of a class, and within that class I have a struct that within that I have a function. How do I use that function within my main code block. I tried

class artwork {
    struct art {
        // the struct art contains important information such as artist, title and medium. 
    private:
        string artist;
    public:
        void setArtist(string values);
        string getArtist();
    };

    void artwork::art::setArtist(string values) {
        artist = values;
    }

int main (){
    artwork myartwork[500];
    for (int i = 0; i < 500; i++) {

        ///-----------------------------------
        ///-----------------------------------
        // below is where the error occurs? How do I reference setArtist?
        ///-----------------------------------
        ///-----------------------------------

        cout << myartwork[0].art.setArtist("Tim");
    }
    system("pause");
    return 0;
}
4

2 回答 2

1

这里有几件事需要改变:

  1. class artwork需要一个类型的成员变量art
  2. 该成员变量需要公开
  3. 成员变量需要有一个不同于 的名称art,因为它已经命名了结构的类型
  4. 你需要一个右花括号和分号artwork

您的代码可能应该解析为以下内容:

class artwork {
public:
    struct art {
    private:
        string artist;
    public:
        void setArtist(string values){artist = values;}
        string getArtist(){return artist;}
    } art_;
};

int main (){
    artwork myartwork[500];
     for(int i = 0; i < 500; i++) {
         myartwork[i].art_.setArtist("Tim");
         cout << myartwork[i].art_.getArtist();

     }
}

其他有用的提示:

  1. 通过引用传递对象
  2. 在构造函数中初始化,而不是使用初始化方法
  3. 更喜欢对数据聚合类型的构造函数进行赋值初始化
  4. 针对数组大小而不是幻数循环
  5. 使 getter 通过 const 引用返回
  6. 制作不能改变对象状态的方法 const
  7. 使成员在对象的生命周期内不变

编辑:

将您的类定义视为蓝图,将成员视为实际对象。如果我们想要一个artwork具有多个art对象的对象,也许在协作的情况下,那么我们可以这样做:

class artwork {
public:
    struct art {
    private:
        string artist;
    public:
        void setArtist(string values){artist = values;}
        string getArtist(){return artist;}
    };

    art art1_;
    art art2_;
};

请注意,我们没有定义struct两次,我们只定义了 2 个对象。然后,如果我们有一个艺术品对象,例如:artwork foo我们可以这样做:

foo.art1_("Sam Arnold"s);
foo.art2_("Jonathan Mee"s);
于 2016-07-01T16:58:24.767 回答
-1

根据问题中提供的内容很难判断,但您应该知道 C++ 使所有类成员“私有”,除非另有说明。在这种情况下:

cout << myartwork[0].art.setArtist("Tim");

会失败有两个原因:

  1. setArtist 不可公开访问(因为艺术品是私有的,所以 SetArtist 是公开的没关系,您无法从外部访问它)
  2. cout 很可能期望输出一些东西,所以 setArtist (returning void) 可能会出现问题
于 2016-07-01T16:46:15.020 回答