我试图制作一个用O字符填充的矩阵,但我是新的类。 尝试运行时,我收到以下错误:
错误:'。'之前的意外unqualified-id令牌。
我在课上做错了,但我找不到什么。 有人有想法吗?
#include <iostream>
using namespace std;
class field
{
private:
public:
char** the_field;
int i, j;
char** create_field(void);
void print_field();
};
////////// CREATE THE FIELD //////////
char** field::create_field(void) //define member function
{
for(int i = 0; i < 14; i++)
{
the_field[i] = new char [14];
for(int j = 0; j < 14; j++)
{
the_field[i][j] = 'O';
}
}
return the_field;
}
//////////// PRINT THE FIELD //
void field::print_field()
{
for(int i = 0; i < 14; ++i)
{
for(int j = 0; j < 14; ++j)
{
cout << " " << the_field[i][j] << " ";
}
// putchar('\n');
cout<<"\n";
}
}
int main()
{
//declare objects with type field
field create_field; //declare create_field as type of field
field print_field;
int i, j;
field.create_field();
field.print_field();
return 0;
}
答案 0 :(得分:2)
有多少个字段?我想你想要一个领域,但你宣布了两个领域。我想你想要这个
field my_field;
my_field.create_field();
my_field.print_field();
BTW我认为如果你的成员函数被调用create
和print
,你会同意这段代码会更好。一般来说,我不认为在他们所属的课程之后命名你的成员函数是个好主意。
答案 1 :(得分:0)
您的代码中存在许多问题:
我已经为你修好了,请试一试。
#include <iostream>
using namespace std;
class field
{
private:
char** the_field;
int width;
int height;
public:
// constructor
field(int w, int h);
// destructor
~field();
// method
void print();
};
field::field(int w, int h)
{
width = w;
height = h;
the_field = new char*[width];
for (int i=0; i<width; i++)
{
the_field[i] = new char[height];
for (int j=0; j<height; j++)
{
the_field[i][j] = 'O';
}
}
}
field::~field()
{
for (int i=0; i<width; i++)
delete[] the_field[i];
delete[] the_field;
}
void field::print()
{
for(int i=0; i < width; i++)
{
for(int j=0; j < height; j++)
{
cout << " " << the_field[i][j] << " ";
}
cout << "\n";
}
}
int main()
{
field* myfield = new field(14, 14);
myfield->print();
delete myfield;
return 0;
}
答案 2 :(得分:0)
您正在使用班级名称。 '' operator用于类的对象以访问其属性。
如果你这样做:
field obj;
obj.create_field();
答案 3 :(得分:0)
field.create_field();
应该是
create_field.create_field();
等
答案 4 :(得分:0)
field create_field; //declare create_field as type of field
field print_field;
您正在创建两个类型为field
的变量,其名称与field
类的成员函数相同。虽然完全合法,但它非常令人困惑,可能不是你想要的。
field.create_field();
field.print_field();
这是不正确的代码,因为必须在类的实例上调用非静态成员函数,但是您尝试直接在类上调用它们。如果它们是static
,您可以这样做,但是您必须使用::
代替.
。
但这可能不是你想要的。我假设您想创建一个field
对象,然后在其上调用成员函数。代码将是:
field fieldInstance;
fieldInstance.create_field();
fieldInstance.print_field();
关于设计的附注:
使用类的封装原则通常是个好主意。这意味着数据成员不应该是public
,它们应该隐藏在访问者之下。
没有理由在成员函数名称中重复类名 - 它们首先是类的一部分。
将对象创建与初始化分开通常是一个坏主意。 create_field()
的代码作为field
的构造函数会更好。
如果可能,最好避免在C ++中手动分配内存。通常,使用std::vector
远远优于手动分配动态数组。
创建打印功能时,最好传入一个流对象,以便轻松重定向打印。
总之,我会像这样设计你的课程:
class field
{
std::vector<std::vector<char> > the_field;
public:
field();
const std::vector<std::vector<char> >& getField() const { return the_field; }
void print(std::ostream &stream) const;
}
field::field() :
the_field(14, std::vector<char>(14, 'O'))
{}
void field::print(std::ostream &stream) const
{
for (size_t i = 0; i < the_field.size(); ++i) {
for (size_t j = 0; j < the_field[i].size(); ++j) {
stream << ' ' << the_field[i][j] << ' ';
}
stream << '\n';
}
}
当然,getFied()
函数实际上有点过于强大,返回对数据的直接引用。最好提供一个基于语义的界面,为您的课程的预期用途量身定制 - 也许char get(size_t i, size_t j) const
。