создание конструктора c ++ с параметрами - PullRequest
0 голосов
/ 02 октября 2019

Я обновляю, как писать конструкторы на C ++, но версия документации C ++ генерирует глупые ошибки компилятора.

Я смотрел на другие примеры из-за переполнения стека и имитировал их, и все еще похожие ошибки

предположим, что #include уже здесь .h file

class Matrix{
    private:
    //eventually going to create 2d vector here
    public:
      // from: http://www.cplusplus.com/doc/tutorial/classes/
      Matrix (string);
      //another way shown from other examples
      Matrix (string filename); 
  };

.cpp

Matrix::Matrix(string filename){
    int num = 0;
    string line;
    ifstream matrix_file(filename);
    if(matrix_file.is_open()){
      while(getline(matrix_file, line)){
        stringstream extract(line);
        while(extract >> num){
          cout << num << " ";
        }
        cout << '\n';
      }
      matrix_file.close();
    }

  }

main.cpp

int main(int argc, char *argv[]){

    string filename = argv[1];
    Matrix grid (filename);
    return 0;
  }

Я ожидаюСоздание объекта при вызове конструктора выводит значения в файле. Но при компиляции я получаю:

matrix.h:6:12: warning: unnecessary parentheses in declaration of ‘string’ [-Wparentheses]
     Matrix (string);
            ^
matrix.h:6:19: error: field ‘string’ has incomplete type ‘Matrix’
     Matrix (string);
                   ^
matrix.h:2:7: note: definition of ‘class Matrix’ is not complete until the closing brace
 class Matrix{

или

matrix.h:6:19: error: expected ‘)’ before ‘filename’
     Matrix (string filename);
            ~      ^~~~~~~~~
                   )
main.cpp: In function ‘int main(int, char**)’:
main.cpp:11:24: error: no matching function for call to ‘Matrix::Matrix(std::__cxx11::string&)’
   Matrix grid (filename);

в зависимости от того, каким образом я инициализирую строковый параметр в файле .h. Я думаю, у меня где-то есть небольшая опечатка, но я не нахожу ничего плохого в этом простом куске кода. Любая помощь приветствуется. Спасибо

Ответы [ 2 ]

2 голосов
/ 02 октября 2019

вам нужно include <string> и ограничить его std::, так как string также является частью пространства имен std. Вы можете сделать using namespace std для удобства. Что касается определения конструктора в заголовке, я думаю, что лучше опустить имя параметра и просто указать тип.

1 голос
/ 02 октября 2019

Есть несколько проблем с вашим кодом.

Во-первых, вы не включили <string>. Вам также нужно будет указать <sstream>, <fstream> и <iostream>. Не считается хорошей практикой включать целое пространство имен с using namespace std. Таким образом, префиксные типы из стандартной библиотеки имеют std:: - т.е. std::string, std::ifstream, std::stringstream и std::cout.

Во-вторых, у вас есть дубликаты конструкторов, принимающих один параметр std :: string:

Matrix(string);

Matrix(string filename); 

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

Matrix(std::string filename);

Вы можете изменить эту строку, чтобы принять const std::string&, чтобы избежать копирования. Однако это зависит от вас.

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