ссылка на класс из другого файла с оператором области видимости (: :) - PullRequest
0 голосов
/ 21 января 2020

У меня есть файл main.cpp, с #include "engine.h" в начале.

Внутри engine.h есть

#include "myObject.h"

namespace nmspc{
   MyObject obj1;

   //some code here
}

, а myObject.h имеет:

#include <iostream>

class MyObject{
public:

   void helloWorld(){
      std::cout << "Hello, World!" << std::endl;
   }

}

Почему я не могу сослаться, есть в моем main.cpp что-то вроде этого?:

int main{

   nmspc::obj1::helloWorld();

   return 0;
}

вместо этого я должен набрать либо nmspc::obj1.helloWorld(), либо MyObject::helloWorld(). Но я бы хотел использовать приведенный выше.

Ответы [ 2 ]

3 голосов
/ 21 января 2020

Вы можете сделать что-то подобное, используя stati c функции-члены , добавив ключевое слово static перед объявлением метода. если вы сделаете это, функция не будет связана с фактическим созданием экземпляра класса, поэтому не сможет получить доступ к каким-либо переменным-элементам или к не * stati c функциям-членам.

В общем случае вы не получите доступ к stati c функции-члены через созданный объект, но через имя класса (хотя можно вызывать его через экземпляр).

class MyObject{
public:

   static void helloWorld() {
      std::cout << "Hello, World!" << std::endl;
   }

}

int main{

   MyObject::helloWorld();

   return 0;
}

Должен ли вы делать это зависит от контекста. Ваша программа достаточно проста, поэтому не сразу понятно, почему вы должны сделать ее функцией-участником stati c, а не бесплатной функцией, но я не уверен, что у меня достаточно контекста, чтобы давать советы.

0 голосов
/ 23 января 2020

1-й из всех
неверное содержимое заголовка

#include "myObject.h"

namespace nmspc{

   MyObject obj1;

   //some code here
}   

это должно быть в cpp модуле, то есть: единица перевода
, поскольку это экземпляр, т.е. код времени выполнения)
, тогда как заголовок - это место для всех stati c связанных содержимого

, если вы хотите написать MyObject :: helloWorld ()
может иметь это здесь

myObject.h:

#include <iostream>


namespace nmspc{


class MyObject{
public:
   void helloWorld();
};

MyObject::helloWorld(){
          std::cout << "Hello, World!" << std::endl;
       }
}

, потому что :: (разрешение разрешения области) - это то, к чему относится пространство имен или класс / структура
например nmspc::MyObject::helloWorld

может быть helloWorld класс внутри MyObject класс принадлежит nmspc пространство имен
может быть helloWorld класс принадлежит MyObject пространство имен принадлежит nmspc пространство имен. et c

int main{

   MyObject obj1;

     //some code here

   nmspc::obj1.helloWorld();

   return 0;
}
...