无法在 C++ 中修改 class 内的数组
Unable to modify an array inside of a class in C++
我是 C++ 新手。我刚刚用 Visual Studio 代码编写了这个程序,但我收到两个错误,我还没有找到解释。
这是代码:
#include <iostream>
using namespace std;
class net{
public: bool isConv = false;
public: int structure[2];
structure[0] = 1;
};
int main() {
net n;
cout<< n.structure;
return 0;
}
我收到的错误是:
error: C++ requires a type specifier for all declarations" in line 5
error: duplicate member 'structure'" in line 6
我认为代码认为我试图在第 6 行定义一个名为 structure
的新变量,而我只是试图修改数组的第一个值。
相同的两行代码如果在 main()
函数中工作正常,但在 class 中它们似乎不起作用。
谁能帮我理解为什么会出现这些错误,以及如何解决这些错误?
一个赋值是一个表达式。后跟分号的表达式是表达式语句。在 C++ 语言的 class 范围内不能有表达式语句。所有表达式语句都必须在函数定义中。
删除行 structure[0] = 1;
.
您可以像为 isConv
所做的那样为 structure
提供默认成员初始化程序。
class net{
public:
bool isConv = false;
int structure[2] {1, 0};
};
请注意,如果您希望使用默认成员初始化器,则不得使用默认初始化,除非您提供用户定义的构造函数。改为这样做:
net n{};
cout << n.structure;
您不能为未在声明中的变量赋值。在这种情况下,您可以只使用这样的构造函数
net(){
structure[0] = 1;
}
或另一个答案的解决方案
在class中,你定义了所有的变量和函数,但你要做的是尝试在class中进行操作。您只能在函数内部创建它们,因此解决问题的最佳方法是在 class 的构造函数内部进行操作。构造函数是一个函数,其名称与 class 相同,并在您初始化 class.
时运行
还有一些其他问题,不一定会使您的代码无法运行,但最好避免它们。
首先是您将 public 和 private 关键字视为例如 Java,其中您将函数或变量设为私有,具体取决于它们前面的关键字。在 C++ classes 中,它们像“部分”一样工作,function/variable 是 public/private,具体取决于您在哪个部分定义它们。
另一个问题是你什么都做 public,尽管这不是必需的。如果你想访问一个变量,无论是读取它还是修改它,你总是可以使用 getter 或 setter。这些基本上是函数,return 变量 (getters) 或修改变量 (setters)。
如果您想让 class 的用户可以访问 (public) 函数,您可以在 class 的 public“部分”中定义它],如果您希望它是私有的并且仅供 class 本身使用,请在私有“部分”中定义它。
当你只打印 structure
数组时,你不会打印数组的变量,而是它的内存地址,因为 C++ 中的 C 风格数组只是指针。这也是为什么在 C++ 中 returning C 样式数组时,return 类型必须是指针(因此在您的情况下 int*
,而不仅仅是 int
).如果您想全部打印它们,请制作一个 for 循环并循环遍历数组并打印变量。例如,如果您只想打印第一个元素,请调用 getter 函数并将 [0]
附加到它,就像您对普通数组所做的那样。如果你还没有准备好学习指针,因为一开始学习它们可能会很粗糙,你可以看看向量。
您的代码的最后一个问题是第 using namespace std;
行。写小程序或者学习的时候倒是没什么大不了的,但是以后要避免。
此外,class 名称通常大写(至少根据我的经验)。
我在代码中包含了一些注释,以便您更好地理解它。排除所有问题后的代码(除了 using namespace std;
问题,因为我不想让你太迷惑)应该是这样的:
#include <iostream>
using namespace std;
class Net { // Capitalized class name
public: // Public section of the class, define your public functions here
Net() { // This is the constructor
this->structure[0] = 1; // "this->" means we are referring to a variable belonging to the class
}
int* get_structure() { // A getter for the structure array
return this->structure; // Returning the array
}
private: // Private section of the class, define your variables and functions used only by the class here
bool isConv = false;
int structure[2];
};
int main() {
Net n;
int* structure = n.get_structure(); // Store n.structure in the structure variable (even though it is a pointer, you can use it as normal array)
cout << n.get_structure() << endl; // Output: (a memory address)
cout << n.get_structure()[0] << endl; // Output: 1
cout << structure << endl; // Output: (a memory address)
cout << structure[0] << endl; // Output: 1
return 0;
}
我是 C++ 新手。我刚刚用 Visual Studio 代码编写了这个程序,但我收到两个错误,我还没有找到解释。
这是代码:
#include <iostream>
using namespace std;
class net{
public: bool isConv = false;
public: int structure[2];
structure[0] = 1;
};
int main() {
net n;
cout<< n.structure;
return 0;
}
我收到的错误是:
error: C++ requires a type specifier for all declarations" in line 5
error: duplicate member 'structure'" in line 6
我认为代码认为我试图在第 6 行定义一个名为 structure
的新变量,而我只是试图修改数组的第一个值。
相同的两行代码如果在 main()
函数中工作正常,但在 class 中它们似乎不起作用。
谁能帮我理解为什么会出现这些错误,以及如何解决这些错误?
一个赋值是一个表达式。后跟分号的表达式是表达式语句。在 C++ 语言的 class 范围内不能有表达式语句。所有表达式语句都必须在函数定义中。
删除行 structure[0] = 1;
.
您可以像为 isConv
所做的那样为 structure
提供默认成员初始化程序。
class net{
public:
bool isConv = false;
int structure[2] {1, 0};
};
请注意,如果您希望使用默认成员初始化器,则不得使用默认初始化,除非您提供用户定义的构造函数。改为这样做:
net n{};
cout << n.structure;
您不能为未在声明中的变量赋值。在这种情况下,您可以只使用这样的构造函数
net(){
structure[0] = 1;
}
或另一个答案的解决方案
在class中,你定义了所有的变量和函数,但你要做的是尝试在class中进行操作。您只能在函数内部创建它们,因此解决问题的最佳方法是在 class 的构造函数内部进行操作。构造函数是一个函数,其名称与 class 相同,并在您初始化 class.
时运行还有一些其他问题,不一定会使您的代码无法运行,但最好避免它们。
首先是您将 public 和 private 关键字视为例如 Java,其中您将函数或变量设为私有,具体取决于它们前面的关键字。在 C++ classes 中,它们像“部分”一样工作,function/variable 是 public/private,具体取决于您在哪个部分定义它们。
另一个问题是你什么都做 public,尽管这不是必需的。如果你想访问一个变量,无论是读取它还是修改它,你总是可以使用 getter 或 setter。这些基本上是函数,return 变量 (getters) 或修改变量 (setters)。
如果您想让 class 的用户可以访问 (public) 函数,您可以在 class 的 public“部分”中定义它],如果您希望它是私有的并且仅供 class 本身使用,请在私有“部分”中定义它。
当你只打印 structure
数组时,你不会打印数组的变量,而是它的内存地址,因为 C++ 中的 C 风格数组只是指针。这也是为什么在 C++ 中 returning C 样式数组时,return 类型必须是指针(因此在您的情况下 int*
,而不仅仅是 int
).如果您想全部打印它们,请制作一个 for 循环并循环遍历数组并打印变量。例如,如果您只想打印第一个元素,请调用 getter 函数并将 [0]
附加到它,就像您对普通数组所做的那样。如果你还没有准备好学习指针,因为一开始学习它们可能会很粗糙,你可以看看向量。
您的代码的最后一个问题是第 using namespace std;
行。写小程序或者学习的时候倒是没什么大不了的,但是以后要避免。
此外,class 名称通常大写(至少根据我的经验)。
我在代码中包含了一些注释,以便您更好地理解它。排除所有问题后的代码(除了 using namespace std;
问题,因为我不想让你太迷惑)应该是这样的:
#include <iostream>
using namespace std;
class Net { // Capitalized class name
public: // Public section of the class, define your public functions here
Net() { // This is the constructor
this->structure[0] = 1; // "this->" means we are referring to a variable belonging to the class
}
int* get_structure() { // A getter for the structure array
return this->structure; // Returning the array
}
private: // Private section of the class, define your variables and functions used only by the class here
bool isConv = false;
int structure[2];
};
int main() {
Net n;
int* structure = n.get_structure(); // Store n.structure in the structure variable (even though it is a pointer, you can use it as normal array)
cout << n.get_structure() << endl; // Output: (a memory address)
cout << n.get_structure()[0] << endl; // Output: 1
cout << structure << endl; // Output: (a memory address)
cout << structure[0] << endl; // Output: 1
return 0;
}