数组和类?

Arrays and Classes?

我是 C++ 的新手,正在从事一个项目,其中我有一个 class 的实例数组,在那个 class 中我有一个结构,我在其中有一个函数。 我如何在我的主代码块中使用该函数。我试过了

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

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

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

会因两个原因而失败:

  1. setArtist public不可访问(因为艺术对象是私有的,SetArtist 是 public 并不重要,您无法从外部访问它)
  2. cout 最有可能期待 要输出的东西,所以 setArtist (返回无效)可能会 提出问题

这里有几处需要更改:

  1. class artwork需要一个art
  2. 类型的成员变量
  3. 那个成员变量需要做成public
  4. 成员变量需要有一个不同于art的名称,因为它已经命名了结构的类型
  5. artwork
  6. 需要右大括号和分号

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

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. 通过 const 引用制作 getters return
  6. 使不能改变对象状态的方法为const
  7. 使在对象的生命周期内不变的成员成为常量

编辑:

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

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);