Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Линковка] Как обратиться к классу, определенному, в другом cpp-файле? 
V
    Опции темы
zim22
Дата 17.7.2009, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



К функции xxx мы обращаться можем из main.cpp. Хотя она и определена в другом файле.
Как создать объект класса First в файле main.cpp? (не использую #include и файлы заголовков)

Код

// first.cpp
class First {
public:
  void fcn() { }
};
void xxx() { }

Код

// main.cpp
int main() {
  void xxx();
  xxx();

  First f; // error
  f.fcn();
}




--------------------
PM MAIL   Вверх
azesmcar
Дата 17.7.2009, 14:50 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



zim22

Указатель можно создать так
Код

class A;

int main()
{
    A* ptr;
}

а вот создать обьект - никак без включения заголовочного файла. Откуда ему знать, есть у класса такой конструктор, открыт ли он вообще итд... А это все компилятору нужно знать на этапе компиляции.

PM   Вверх
mes
Дата 17.7.2009, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(zim22 @  17.7.2009,  13:44 Найти цитируемый пост)
Как создать объект класса First в файле main.cpp?

интересно, как для т.с. связано  "создание объекта"  и "линковка" ?

Это сообщение отредактировал(а) mes - 17.7.2009, 14:55


--------------------
PM MAIL WWW   Вверх
AlexT84
Дата 17.7.2009, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 10.7.2009

Репутация: нет
Всего: 1



Не используя инклуда -- только заново описать класс First.
PM MAIL   Вверх
zim22
Дата 17.7.2009, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(mes @  17.7.2009,  14:54 Найти цитируемый пост)
интересно, как для т.с. связано  "создание объекта"  и "линковка" ?

я сейчас разбираюсь в том, как происходит сборка программмы из исходников. линковка - один из её этапов.
но до линковки не доходит, т.к. исходник даже не компилирууется. smile

класс определён в одном  translation unit
использовать его я хочу в другом  translation unit
значит необходимо обеспечить взаимодействие между юнитами.

здесь  сказано следующее:
Цитата

C and C++ provide for three levels of linkage:
• A name with no linkage denotes an entity that can’t be referenced via names from anywhere else.
• A name with internal linkage denotes an entity that can be referenced via names declared in the same scope or in other scopes of the same translation unit.
• A name with external linkage denotes an entity that can be referenced via names declared in the same scope or in other scopes of the same translation unit (just as with internal linkage), or   additionally in other translation units.


Цитата(azesmcar @  17.7.2009,  14:50 Найти цитируемый пост)
а вот создать обьект - никак без включения заголовочного файла

вы хотите сказать, что нельзя написать программу без использования заголовочных файлов?



--------------------
PM MAIL   Вверх
azesmcar
Дата 17.7.2009, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(zim22 @  17.7.2009,  15:48 Найти цитируемый пост)
вы хотите сказать, что нельзя написать программу без использования заголовочных файлов?

почему это нельзя? Можно!
Код

int main() {}

вот она smile 

Цитата(zim22 @  17.7.2009,  15:48 Найти цитируемый пост)
класс определён в одном  translation unit
использовать его я хочу в другом  translation unit

Цитата(zim22 @  17.7.2009,  15:48 Найти цитируемый пост)
но до линковки не доходит, т.к. исходник даже не компилирууется

Как он будет компилироваться?
Код

class A;
int main()
{
    A* ptr = new A();
}

поставьте себя на место компилятора. Можно ли компилировать этот код, не зная есть ли класса A конструктор по умолчанию (например).
PM   Вверх
zim22
Дата 17.7.2009, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(azesmcar @  17.7.2009,  15:51 Найти цитируемый пост)
 Можно ли компилировать этот код, не зная есть ли класса A конструктор по умолчанию (например).

ну а почему с функциями прокатывает?


--------------------
PM MAIL   Вверх
azesmcar
Дата 17.7.2009, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(zim22 @  17.7.2009,  15:53 Найти цитируемый пост)
ну а почему с функциями прокатывает? 

можно пример, чтобы было понятнее о чем идет речь?

Добавлено @ 15:57
подозреваю что речь идет об этом
Код

void foo();

int main()
{
    foo();
}


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

(непонятно зачем приписал extern, он тут не нужен, убрал).

Это сообщение отредактировал(а) azesmcar - 17.7.2009, 16:00
PM   Вверх
zim22
Дата 17.7.2009, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(azesmcar @  17.7.2009,  15:54 Найти цитируемый пост)
можно пример, чтобы было понятнее о чем идет речь?

функция определена в другом файле. тем не менее линкер/компилятор её находит.
Код

// main.cpp
int main()
{
  void fcn();
  fcn();

    return 0;
}


Код

// file.cpp
void fcn() { }





--------------------
PM MAIL   Вверх
azesmcar
Дата 17.7.2009, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



zim22

Ну, прототип функции обявлен ведь.
Код

class A
{
public:
    A();
};

int main()
{
    A t;
}

с классами тоже можно. Вот так. А включение заголовочного файла только копирует его содержимое в текущий.
PM   Вверх
zim22
Дата 17.7.2009, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(azesmcar @  17.7.2009,  16:02 Найти цитируемый пост)
с классами тоже можно. Вот так.

у меня не получается. этап линковки не проходит.
Код

// main.cpp
class A {
public:
  A();
};

int main()
{  
   A t;
  return 0;
}


Код

// A.cpp
class A
{
public:
  A(){}
};


Это сообщение отредактировал(а) zim22 - 17.7.2009, 16:06


--------------------
PM MAIL   Вверх
azesmcar
Дата 17.7.2009, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



file1.cpp
Код

class A
{
public:
    A();
};

int main()
{
    A t;
}


file2.cpp
Код

#include <iostream>

//Тут тоже нужно
class A {
public:
    A();
};

A::A()
{
}

а вот эту часть
Цитата

class A {
public:
    A();
};

заменяют на #include а саму декларацию выделяют в заголовочный файл.

PM   Вверх
zim22
Дата 17.7.2009, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(azesmcar @  17.7.2009,  16:09 Найти цитируемый пост)
а вот эту часть заменяют на #include а саму декларацию выделяют в заголовочный файл.

большое спасибо! я ж говорил, что можно без #include обходиться smile



--------------------
PM MAIL   Вверх
azesmcar
Дата 17.7.2009, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(zim22 @  17.7.2009,  16:11 Найти цитируемый пост)
что можно без #include обходиться 

А я как будто не соглашался smile 
#include по сути вставляет содержимое одного файла в другой, разумеется без него можно (если делать тоже самое самому) smile

Это сообщение отредактировал(а) azesmcar - 17.7.2009, 16:14
PM   Вверх
zim22
Дата 17.7.2009, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Почему в случае определения функции внутри класса линкер не находит её?
Код

//A.cpp
class A
{
public:
  A();
  void fcn(){}
private:
  int data;
};

A::A() { }


Код

// main.cpp
class A {
public:
  A(); 
  void fcn();
};

int main()
{  
   A t;
   t.fcn();
  return 0;
}



--------------------
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0995 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.