-6

我试图制作一个充满 O 字符的矩阵,但我是新手。尝试运行时出现以下错误:

错误:“。”之前出现意外的不合格 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;
 }
4

5 回答 5

2

有多少个领域?我认为你想要一个字段,但你已经声明了两个。我想你想要这个

field my_field;

my_field.create_field();
my_field.print_field();

顺便说一句,我想你会同意,如果你的成员函数被调用,这段代码会更好createprint。一般来说,我认为在成员函数所属的类之后命名它们不是一个好主意。

于 2013-05-01T08:32:54.300 回答
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()funcio其实有点太强大了,直接返回数据的引用。最好提供一个为您的类的预期用途量身定制的基于语义的接口——也许char get(size_t i, size_t j) const.

于 2013-05-01T08:47:21.420 回答
0

你的代码有很多问题:

  • 如果你用 new 创建一些东西,你还必须在那个对象上调用 delete
  • the_field 应该是私有的
  • 你不需要在类中定义 i 和 j,因为它们已经在 for 循环中定义了
  • 您忽略了 create_field() 方法返回的内容
  • 网格的大小不是动态的(在类似情况下使用宽度和高度)
  • the_field 是指向指针(在您的情况下为二维数组)的指针,但您只创建列(还必须创建行)
  • ...

我已经给你修好了,你试试看。

    #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;
    }
于 2013-05-01T08:35:45.120 回答
0

您正在使用类名。'。' 运算符用于类对象访问其属性。如果你这样做: field obj;
obj.create_field();

那么你就不会有问题了。'unqualified id' 意味着你没有给它一个有效的标识符。而你没有,因为你使用类名而不是对象的标识符。

于 2013-05-01T08:42:55.653 回答
0
field.create_field();

应该

create_field.create_field();

等等

于 2013-05-01T08:43:38.380 回答