Простая синтаксическая ошибка все еще ускользает от меня - PullRequest
0 голосов
/ 15 апреля 2010

Вот заголовок для класса, который я начал:

#ifndef CANVAS_
#define CANVAS_

#include <iostream>
#include <iomanip>
#include <string>
#include <stack>

class Canvas
{
  public:

  Canvas();
  void Paint(int R, int C, char Color);
  const int Nrow;
  const int Ncol;
  string Title;
  int image[][100];
  stack<int> path;
  struct PixelCoordinates
   {
    unsigned int r;
    unsigned int c;
   } position;
   Canvas operator<< (const Canvas& One );
  Canvas operator>>( Canvas& One );
};

/*-----------------------------------------------------------------------------
   Name:      operator<<
   Purpose:   Put a Canvas into an output stream
-----------------------------------------------------------------------------*/
ostream& operator<<( ostream& Out, const Canvas& One )
{
  Out << One.Title << endl;
  Out << "Rows: " << One.Nrow << "    Columns: " << One.Ncol << endl;
   int i,j;
   for( i=0; i<One.Nrow; i++)
   {
     cout<<"\n\n\n";
     cout<< " COLUMN\n";
     cout<< " 1 2 3";
     for(i=0;i<One.Nrow;i++)
     {
       cout<<"\nROW "<<i+1;
          for(j=0;j<One.Ncol;j++) cout<< One.image[i][j];
     }
   }

  return Out;
}

/*-----------------------------------------------------------------------------
   Name:      operator>>
   Purpose:   Get a Canvas from an input stream
-----------------------------------------------------------------------------*/

istream& operator>>( istream& In, Canvas& One )
{
//  string Line;
//  int Place = 0;

//  {
//    In >> Line;

//    if (In.good())
//    {
//      One.image[Place][0] = Line;
//      Place++;
//    }
//  return In;

#endif

Вот мой файл реализации для класса Canvas:

using namespace std;
#include <iostream>
#include <iomanip>
#include <string>
#include <stack>
#include "proj05.canvas.h"

//----------------Constructor----------------//

Canvas::Canvas()
{
  Title = "";
  Nrow = 0;
  Ncol = 0;
  image[][100] = {};
  position.r = 0;
  position.c = 0;
}

//-------------------Paint------------------//
void Canvas::Paint(int R, int C, char Color)
{
  cout << "Paint to be implemented" << endl;
}

И ошибки, которые я получаю, следующие:

proj05.canvas.cpp: In function 'std::istream& operator>>(std::istream&, Canvas&)':
proj05.canvas.cpp:11: error: expected `;' before '{' token
proj05.canvas.cpp:24: error: expected `}' at end of input

Из моего ограниченного опыта они выглядят как простые синтаксические ошибки, но я не вижу, чего мне не хватает, на всю жизнь. Я знаю вставлять; в конце Canvas :: Canvas () неверен, но, похоже, именно этого он и ожидает. Может ли кто-нибудь уточнить, пожалуйста, для меня?

(Кроме того, я знаю, что большая часть кода для определений операторов << и >> выглядит ужасно, но, если это не конкретная причина ошибки, не обращайтесь к ней. Это черновик :))

Ответы [ 5 ]

5 голосов
/ 15 апреля 2010

Вам не хватает } для istream& operator>>( istream& In, Canvas& One ) в шапке.

Член данных int image[][100]; также недопустим, как и image[][100] = {}; в ctor.

Файлы вашей реализации (.cpp) должны #include их соответствующий заголовок first . Это простой способ обеспечить автономность заголовка. В этом случае это может привести к синтаксическим ошибкам в заголовках стандартных библиотек, что быстро указывает на проблему в заголовке (поскольку это то, что будет до stdlib #includes).

3 голосов
/ 15 апреля 2010

Вам не хватает закрывающей } для вашего operator>> тела. Кроме того, это не правильно:

using namespace std;
#include <iostream>

Заказ должен быть наоборот. Поведение GCC не соответствует: std не должно быть видимым, если стандартный заголовок еще не включен. Так что на следующем, более совместимом компиляторе он может потерпеть неудачу.

Также в заголовке вы должны написать std::istream вместо istream (то же самое для ostream и т. Д.). В вашем текущем коде ваш заголовок полагается на то, что его пользователи имеют тип typen using namespace std; перед его включением, что довольно уродливо с точки зрения дизайна, поскольку делает заголовки зависимыми от своих пользователей неочевидным способом (обычно должно быть наоборот).

2 голосов
/ 15 апреля 2010

У вас нет закрытия} в конце оператора >>

0 голосов
/ 19 апреля 2010

Существует также ошибка при инициализации постоянных членов вашего класса.

Вы должны использовать список инициализации

Canvas::Canvas()
: Nrow(0), Ncol(0)
{
  Title = "";
  //Nrow = 0; - this is an attempt to change the value of a const, which was already constructed.
  //Ncol = 0; - same as above
  //image[][100] = {};
  position.r = 0;
  position.c = 0;
}
0 голосов
/ 16 апреля 2010

Другие ответили на ваш вопрос, но вот пара дополнительных пунктов:

Если ваши определения операторов вставки и извлечения не шаблонизированы, вам следует переместить их в файл реализации и просто объявить их в заголовочном файле. Это позволит вам заменить линию

#include <iostream>

с линией

#include <iosfwd>

Последний будет включать в себя только объявления потоков ввода-вывода, а не полные определения. Это, в свою очередь, приведет к более быстрому времени компиляции каждой единицы компиляции, содержащей этот заголовок.

С другой стороны, вы также можете оставить эти функции в заголовочном файле, но шаблонировать их.

template <typename Ch,typename Tr>
std::basic_istream<Ch,Tr>& std::operator>>(std::basic_istream<Ch,Tr>& in,
                                           Canvas& o)
{
    // ...
}

Это даст вам дополнительную гибкость поддержки любого потока за счет того же увеличенного времени компиляции, которое у вас есть сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...