数组和类?
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");
会因两个原因而失败:
- setArtist public不可访问(因为艺术对象是私有的,SetArtist 是 public 并不重要,您无法从外部访问它)
- cout 最有可能期待
要输出的东西,所以 setArtist (返回无效)可能会
提出问题
这里有几处需要更改:
class artwork
需要一个art
类型的成员变量
- 那个成员变量需要做成public
- 成员变量需要有一个不同于
art
的名称,因为它已经命名了结构的类型
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();
}
}
其他有用的提示:
- 通过引用传递对象
- 在构造函数中初始化而不是使用初始化方法
- 更喜欢对数据聚合类型的构造函数进行赋值初始化
- 循环数组大小不是幻数
- 通过 const 引用制作 getters return
- 使不能改变对象状态的方法为const
- 使在对象的生命周期内不变的成员成为常量
编辑:
将您的 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);
我是 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");
会因两个原因而失败:
- setArtist public不可访问(因为艺术对象是私有的,SetArtist 是 public 并不重要,您无法从外部访问它)
- cout 最有可能期待 要输出的东西,所以 setArtist (返回无效)可能会 提出问题
这里有几处需要更改:
class artwork
需要一个art
类型的成员变量
- 那个成员变量需要做成public
- 成员变量需要有一个不同于
art
的名称,因为它已经命名了结构的类型 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();
}
}
其他有用的提示:
- 通过引用传递对象
- 在构造函数中初始化而不是使用初始化方法
- 更喜欢对数据聚合类型的构造函数进行赋值初始化
- 循环数组大小不是幻数
- 通过 const 引用制作 getters return
- 使不能改变对象状态的方法为const
- 使在对象的生命周期内不变的成员成为常量
编辑:
将您的 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);