интерфейсы, наследование и что между ними - PullRequest
0 голосов
/ 06 сентября 2010

если я хочу иметь 3 класса, которые имеют общие поля (и я хочу, чтобы они были статическими), и у них была общая функция (которую необходимо переопределить, т.е. виртуальная)

  • чтолучший дизайн для этого?
  • мне нужно создать интерфейс в заголовочном файле
    , а затем создать его .cpp файл и получить от него наследование 3 классов?
  • чтоо статических членах?
  • Могу ли я объявить их в заголовочном файле?
  • при создании заголовочного файла, представляющего интерфейс, нужно ли создавать его .cpp файл?

Ответы [ 2 ]

3 голосов
/ 06 сентября 2010

Объявите классы в заголовочных файлах.
Это сделано для того, чтобы объявление могло совместно использоваться несколькими исходными файлами (с #include) и, таким образом, подчиняться (Одно правило определения).

Традиционно(хотя и не обязательно), что каждый класс имеет свой собственный файл.Чтобы было проще и проще находить вещи, вы должны назвать файл после класса.Поэтому класс A должен быть объявлен в A.h и определен в A.cpp.

MyInterface.h

class MyInterface
{
    protected:
        static int X;
        static int Y;
        static int Z;
    public:
        // If a class contains virtual functions then you should declare a vritual destructor.
        // The compiler will warn you if you don't BUT it will not require it.
        virtual ~MyInterface() {}   // Here I have declared and defined the destructor in
                                    // at the same time. It is common to put very simplistic
                                    // definitions in the header file. But for clarity more
                                    // complex definitions go in the header file. C++ programers
                                    // dislike the Java everything in one file thing because it
                                    // becomes hard to see the interface without looking at the
                                    // documentaiton. By keeping only the declarations in the
                                    // header it is very easy to read the interface.

        virtual int doSomthing(int value) = 0; // Pure virtual
                                               // Must be overridden in derived
 };

А *

 #include "MyInterface.h"

 class A: public MyInterface
 {
     public:
        virtual int doSomthing(int value);
 };

Чч

 #include "MyInterface.h"

 class B: public MyInterface
 {
     public:
        virtual int doSomthing(int value);
 };

Ch

 #include "MyInterface.h"

 class C: public MyInterface
 {
     public:
        virtual int doSomthing(int value);
 };

Теперь вы определяете реализацию в исходных файлах:

MyInterface.cpp

#include "MyInterface.h"

// Static members need a definition in a source file.
// This is the one copy that will be accessed. The header file just had the declaration.
int MyInterface::X = 5;
int MyInterface::Y = 6;
int MyInterface::Z = 7;

A.cpp

#include "A.h"

// Define all the methods of A in this file.
int A::doSomthing(int value)
{
    // STUFF
}

B.cpp

#include "B.h"

int B::doSomthing(int value)
{
    // STUFF
}

C.cpp

#include "C.h"

int C::doSomthing(int value)
{
    // STUFF
}
1 голос
/ 06 сентября 2010
  • В языке C ++ нет явного «интерфейса».
  • Если вы хотите иметь интерфейс-подобный класс, это класс с чисто виртуальными методами (это метод без определения, например, virtual void printme() = 0;).
  • Статические переменные связаны с объектными файлами (внутренняя связь). Если вы определите их в своем заголовочном файле и включите этот заголовочный файл в несколько файлов cpp, вы получите несколько определений этой статической переменной (в разных объектных файлах)
  • Поскольку статические переменные являются либо глобальными, либо частью класса, они не могут быть «общими». Они принадлежат одному классу и могут быть доступны другому.
  • То же самое касается методов. У одного класса есть метод, другой может вызвать его. Если это производный класс, он также может переопределить его (то есть либо скрыть его, либо реализовать виртуальный метод).

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


class Vehicle
{
public:
   virtual void use() = 0;
};

class Car
   : public Vehicle
{
public:
   virtual void use();
};

void Car::use()
{
   // drive the car
}

Чем вы можете использовать автомобиль в качестве транспортного средства, например


Car myCar;
Vehicle& myVehicle = static_cast< Vehicle& >(myCar);
myVehicle.use();  // drive the car.

То, что все является фундаментальным ООП C ++, посмотрите в какой-нибудь книге.

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