Не удается получить правильный вывод из нескольких файлов с помощью g ++ - PullRequest
0 голосов
/ 21 июня 2020

Я только что узнал о классах C ++ в нескольких файлах, но не могу получить ожидаемый результат ...

(main. cpp)

#include <iostream>
#include "Dog.h" //include to be able to use the class

using namespace std;

int main(){
    Dog myDoggy();
    cout << "here";

    return 0;
}

(Dog . cpp)

#include "Dog.h" // includes the header file
#include <iostream> 

using namespace std;

Dog::Dog(){  //class_it_belongs_to::function
    cout << "Woof" << endl; //output I want to receive
}

(Dog.h)

// This is a C++ header file
#ifndef DOG_H
#define DOG_H 
// You define everything here before you use it

class Dog{
    public:
    Dog();  
};

#endif
// The reason for this file is because when you compile it, this will be showed to whoever wants to use this piece of code, whilst the other file will be turned into binary (so they cannot edit the bodies of the functions)

Это результат (я ожидаю увидеть здесь «гав (\ n)», но получаю только « здесь ": Результат, который я получаю после использования g ++ для компиляции кода

Я использую Linux Mint 19.3 и g ++ (Ubuntu 7.5.0- 3ubuntu1 ~ 18.04) 7.5.0 .

Ответы [ 2 ]

1 голос
/ 21 июня 2020

Следующее правило применяется для неоднозначности между переменными и функциями: если это выглядит как функция, это функция.
На основе: Справочника C ++

In в случае неоднозначности между объявлением переменной с использованием синтаксиса прямой инициализации и объявлением функции компилятор всегда выбирает объявление функции; см. прямую инициализацию.

Ваш «вызов»:

Dog myDoggy();

Похоже на функцию с именем «myDoggy», которая возвращает экземпляр Dog и не принимает никаких параметров. Такая ситуация возникает, когда вы пытаетесь создать объект с помощью конструктора по умолчанию и настаиваете на упоминании пустой круглой скобки.

Существует несколько способов создать экземпляр класса:

Dog myDoggy; // The easiest way.

Dog myDoggy({}); // Only if the constructor is not `explicit`.

Dog (myDoggy); // Same as the first one.

Dog (myDoggy)({}); // Same as the second one.

Все вышеперечисленное приведет к одинаковому результату, запомните их, чтобы не сбивать вас с толку в будущем. Есть некоторые ошибки, причиной которых является неправильное понимание вышеупомянутых способов объявления экземпляра.

0 голосов
/ 21 июня 2020

Когда вы создаете экземпляр класса без параметров, вам нужно объявить без скобок.

Dog myDoggy;
...