зависимости контроллера VC ++ - PullRequest
0 голосов
/ 02 февраля 2011

Я создал приложение для формы Windows с именем windowstestapp. Затем я создал вызов класса EXTENDING.CPP, где добавил функцию add(), которая создает объект из класса form1 и получает значение текстового поля для расчета. Проблема возникает, когда я пытался создать экземпляр объекта EXTENDING внутри класса form1; это не позволяет мне создавать объект.

Я считаю, что проблема в двунаправленных зависимостях. Кто-нибудь может мне помочь?

Код для Form1.h: (Я буду использовать только важные коды)

namespace windowstestapp {

    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;

#include "Extending.h"
#include "Extending.cpp"

public ref class Form1 : public System::Windows::Forms::Form
    {

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {

        Extending ^e1=gcnew Extending();

      }
    };
}

Extending.cpp:

#include "StdAfx.h"
#include "Extending.h"
#include "Form1.h"

Extending::Extending(void)
{
}

double Extending::add()
{

    double value=0;
    windowstestapp::Form1 ^f1=gcnew windowstestapp::Form1();

    value=f1->getDistance();

    return value;
}

Ответы [ 2 ]

1 голос
/ 03 февраля 2011

Вы, кажется, путаете понятия исходного файла и включаемого файла.

Проще говоря, в C ++ у вас есть два типа файлов:

  • Исходные файлы содержат исходный код. Это код, который будет выполнен в вашем приложении. Исходные файлы обычно имеют расширение .CPP.
  • Включаемые файлы содержат объявления. Они только описывают элементы в вашем приложении, но не содержат исходного кода. Включаемые файлы обычно имеют расширение .H.

Исходные файлы могут включать включаемые файлы, а включаемые файлы могут включать другие включаемые файлы. Исходные файлы никогда не включаются в другие файлы. Они скомпилированы и связаны друг с другом.

В вашем случае включение «Extending.cpp» в form1.h явно неверно.

Попробуйте разделить ваш код на чистые включаемые файлы и исходные файлы. Это значит:

  • FORM1.H, который содержит объявление класса, но не имеет исходного кода
  • FORM1.CPP, который содержит код класса вашей формы
  • EXTENDING.H, который содержит объявление класса, но без исходного кода
  • EXTENDING.CPP, который содержит исходный код класса Extending

Вы заметите, что FORM1.H не будет нуждаться в EXTENDING.H и наоборот.

С другой стороны, FORM1.CPP может требовать как FORM1.H, так и EXTENDING.H, и, вероятно, EXTENDING.CPP может требовать и FORM1.H, и EXTENDING.H, но это не проблема.

Теперь скомпилируйте оба файла CPP и свяжите их вместе.

Как только вы приобретете больше опыта в C ++, вы увидите, что действительно возможно поместить исходный код во включаемые файлы (чтобы сделать возможной вставку) и иметь циклические зависимости (используя предварительные объявления), но сначала начните приобретать больше опыта в C ++ .

EDIT:

Если в Form1 есть что-то, что требует EXTENDING.H, это может быть один из следующих случаев:

  • У вас есть встроенный метод, который требует определения класса Extending -> переместите метод в form1.cpp.
  • У вас есть член в Form1, который является указателем на класс Extending -> использовать предварительные объявления (на самом деле компилятору не нужно знать полное определение класса, чтобы иметь возможность генерировать код для хранения указателя)
  • У вас есть член в Form1, который является экземпляром Extending -> тогда вам действительно нужно включить EXTENDING.H в FORM1.H
  • Ваш класс Form1 наследуется от Extending -> тогда вам действительно нужно включить EXTENDING.H в FORM1.H
  • В Form1 существует тип данных, который требует определения чего-либо в Extending (может быть перечислением) -> тогда вам действительно нужно включить EXTENDING.H в FORM1.H

Проверьте то же самое для обратного.

Если у вас все еще есть циклическая зависимость, извлеките члены, которые вызывают зависимость, и поместите их в другой класс, который затем может использоваться как EXTENDING.H, так и FORM1.H.

0 голосов
/ 10 февраля 2011

Я сделал это, используя шаблон MVC. Я отделил модели от вида. Я использовал отдельный класс, который будет содержать значения моей формы. Используя этот класс, я получил запрошенные параметры. Теперь это работает нормально.

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