Как правильно использовать реализацию с интерфейсным классом в C ++? - PullRequest
2 голосов
/ 21 июля 2011

У меня есть класс Child и класс Human, где Human имеет все функции, объявленные в Child как виртуальные функции.И класс Child наследуется от Human class.

Я хочу использовать Human в качестве файла интерфейса, чтобы скрыть реализацию в Child.

На самом деле я не настраивал конструктор, но я настроил функцию init(), которая инициализирует основные настройки.

Теперь, как можно использовать Childфункции, использующие Human файл интерфейса?

Я пытался

Human *John = new Child();

, но получил следующие ошибки.

main.cpp:7: error: expected type-specifier before ‘Child’
main.cpp:7: error: cannot convert ‘int*’ to ‘Human*’ in initialization
main.cpp:7: error: expected ‘,’ or ‘;’ before ‘Child

Я не понимаю, где int*пришел из либо.Ни одна из моих объявленных функций не возвращает int *.

edit

main.cpp

#include <stdlib.h>
#include <stdio.h>
#include "Human.h"
using namespace std;
int main(){

    Human *John = new Child();

    return 0;
}

human.h

#ifndef __HUMAN_h__
#define __HUMAN_h__


class Human
{
public:
    virtual void Init() = 0;
    virtual void Cleanup() = 0;
};


#endif

Child.h

#ifndef __CHILD_h__
#define __CHILD_h__

#include "Human.h"


class Child : public Human
{
public:
    void Init();
    void Cleanup();

};

#endif

Child.cpp

#include "Child.h"
void Child::Init()
{
}

void Child::Cleanup()
{
}

Makefile

CC = g++
INC = -I.
FLAGS = -W -Wall
LINKOPTS = -g

all: program

program: main.o Child.o
    $(CC) -Wall -o program main.o Child.o

main.o: main.cpp Human.h
    $(CC) -Wall -c main.cpp Human.h

Child.o: Child.cpp Child.h
    $(CC) -Wall -c Child.cpp Child.h

Child.h: Human.h

clean:
    rm -rf program

Ответы [ 2 ]

7 голосов
/ 21 июля 2011

Вам нужно #include "Child.h" в вашем файле cpp. Вы можете сделать это вместе с включением human.h, или вы не можете включить human.h, поскольку оно будет автоматически включено включением в child.h

#include <stdlib.h>
#include <stdio.h>
#include "Child.h"
#include "Human.h"    // This is no longer necessary, as child.h includes it  
using namespace std;
int main(){
    Human *John = new Child();
    return 0;
}
2 голосов
/ 21 июля 2011

У вас нет определения для дочернего класса в вашем main.cpp.Скорее всего, вы включили Human.h:

#include "human.h"

вместо Child.h:

#include "child.h"

Но это предположение.Несомненно то, что код, который включает определение класса Child, недоступен в Main.cpp в тот момент, когда у вас есть ошибка.Это может быть связано с неправильным или отсутствующим #include или неправильным использованием директив прекомпилятора #ifdef.Но чтобы помочь вам лучше, нам нужно больше кода, такого как объявление «Child.h» и «Human.h» и полный код «Main.cpp».

Для интерфейсачасть.Чтобы иметь действительно чистый интерфейс, вы не должны реализовывать в нем какую-либо функцию.Это лучшая практика использования интерфейсов.В C ++ вы можете реализовать некоторые функции, но это будет не интерфейс (он же чисто виртуальный или абстрактный класс), а виртуальный класс (который все еще нельзя выделить, но он не настолько абстрактен, чтобы его можно было рассматривать как интерфейсы)

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