错误:'。'之前的意外unqualified-id令牌。

时间:2013-05-01 08:30:28

标签: c++

我试图制作一个用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;
 }

5 个答案:

答案 0 :(得分:2)

有多少个字段?我想你想要一个领域,但你宣布了两个领域。我想你想要这个

field my_field;

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

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

答案 1 :(得分:0)

您的代码中存在许多问题:

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

我已经为你修好了,请试一试。

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

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

答案 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