powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / C++ разные реализации
18 сообщений из 18, страница 1 из 1
C++ разные реализации
    #38151855
scymaks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Граждане! Редко очень пишу на C++, и вот вдруг понадобилось.

Я задам очень простой вопрос. Как надо "обустраивать" приложение, если есть несколько реализаций?

Ну вот пример:

Код: plaintext
1.
2.
3.
4.
5.
6.
#ifndef ABSTRACT_METHOD_H
#define ABSTRACT_METHOD_H

void executeMethod();

#endif



Реализация #1
Код: plaintext
1.
2.
3.
4.
5.
6.
#include "AbstractMethod.h"
#include <iostream>

void executeMethod() {
	std::cout << "simple method" << std::endl;
}



Реализация #2
Код: plaintext
1.
2.
3.
4.
5.
6.
#include "AbstractMethod.h"
#include <iostream>

void executeMethod() {
	std::cout << "complex method" << std::endl;
}



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
/*
   Как мне теперь указать, что нужна версия именно из SimpleMethod.cpp ?
*/
int main(int argc, char ** argv) {
	executeMethod();

	return 0;
}
...
Рейтинг: 0 / 0
C++ разные реализации
    #38151858
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scymaksесть несколько реализаций?и что, линкер не ругается, что executeMethod аж две штуки стало?
...
Рейтинг: 0 / 0
C++ разные реализации
    #38151859
scymaks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Паганель,

ругается
...
Рейтинг: 0 / 0
C++ разные реализации
    #38151862
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scymaksКак мне теперь указать, что нужна версия именно из SimpleMethod.cpp ?

Линковать с SimpleMethod.obj.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
C++ разные реализации
    #38151863
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот пример:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
#ifndef ABSTRACT_METHOD_H
#define ABSTRACT_METHOD_H

void executeMethod_Simple();
void executeMethod_Complex();

#endif



Реализация #1
Код: plaintext
1.
2.
3.
4.
5.
6.
#include "AbstractMethod.h"
#include <iostream>

void executeMethod_Simple() {
	std::cout << "simple method" << std::endl;
}



Реализация #2
Код: plaintext
1.
2.
3.
4.
5.
6.
#include "AbstractMethod.h"
#include <iostream>

void executeMethod_Complex() {
	std::cout << "complex method" << std::endl;
}



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
/*
   Как мне теперь указать, что нужна версия именно из SimpleMethod.cpp ?
*/
int main(int argc, char ** argv) {

        if( I_Want_Simple ) {
        	executeMethod_Simple();
        } else {
        	executeMethod_Complex();
        }
	return 0;
}
...
Рейтинг: 0 / 0
C++ разные реализации
    #38151864
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scymaksругается
Убери из списка файлов ComplexMethod.obj.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
C++ разные реализации
    #38151867
scymaks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
// ComplexMethod.cpp
#include "AbstractMethod.h"
#include <iostream>

#ifdef COMPLEX_METHOD

void executeMethod() {
	std::cout << "complex method" << std::endl;
}

#endif



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
// SimpleMethod.cpp
#include "AbstractMethod.h"
#include <iostream>

#ifdef SIMPLE_METHOD

void executeMethod() {
	std::cout << "simple method" << std::endl;
}

#endif



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
#include "AbstractMethod.h"

//#define COMPLEX_METHOD // используем реализацию ComplexMethod.cpp
#define SIMPLE_METHOD // используем реализацию SimpleMethod.cpp

#include "SimpleMethod.cpp"
#include "ComplexMethod.cpp"


int main(int argc, char ** argv) {
	executeMethod();

	return 0;
}
...
Рейтинг: 0 / 0
C++ разные реализации
    #38151869
scymaks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот такой вот изврат.

Почему с классами таких проблем не возникает? Из-за пространства имен?
...
Рейтинг: 0 / 0
C++ разные реализации
    #38151877
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scymaksВот такой вот извратя так и не понял, зачем давать двум функциям одинаковые имена
...
Рейтинг: 0 / 0
C++ разные реализации
    #38151879
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scymaks,

Тут ошибка, нарушение one definition rule.
ты должен собирать это все только с одним из модулей, где есть эта функция.

Собственно, других решений язык C и не дает.

Но есть другие варианты, если использовать ООП.
...
Рейтинг: 0 / 0
C++ разные реализации
    #38151889
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На уровне make скриптов можно наверное и не такое сбацать.
...
Рейтинг: 0 / 0
C++ разные реализации
    #38151902
scymaks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

вот так?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
#ifndef ABSTRACT_METHOD_H
#define ABSTRACT_METHOD_H

class AbstractMethod {
public:
	virtual void execute() = 0;
};

#endif



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
#include "AbstractMethod.h"
#include <iostream>

class SimpleMethod: public AbstractMethod {
public:
	void execute() {
		std::cout << "simple method" << std::endl;
	}
};



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
#include "AbstractMethod.h"
#include <iostream>

class ComplexMethod: public AbstractMethod {
public:
	void execute() {
		std::cout << "complex method" << std::endl;
	}
};



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
#include "AbstractMethod.h"

#include "SimpleMethod.cpp"
#include "ComplexMethod.cpp"


int main(int argc, char ** argv) {
	AbstractMethod * method = new SimpleMethod();
	method->execute();

	return 0;
}
...
Рейтинг: 0 / 0
C++ разные реализации
    #38152044
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы б сразу сказали что нужен полиморфизм
...
Рейтинг: 0 / 0
C++ разные реализации
    #38152100
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
namespace:
...
Рейтинг: 0 / 0
C++ разные реализации
    #38152184
Mike7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ведь в C11 появились шаблоны, может с их помощью можно решить вопрос?

Код: plaintext
1.
2.
3.
4.
/* Type-generic expressions using the _Generic keyword. 
For example, the following macro cbrt(x) translates to cbrtl(x), cbrt(x) or cbrtf(x) depending on the type of x: */

#define cbrt(X) _Generic((X), long double: cbrtl,  default: cbrt,  float: cbrtf)(X)
...
Рейтинг: 0 / 0
C++ разные реализации
    #38152205
scymaks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Паганель,

Так в том-то и дело, что хотелось на функциях такое сделать, без классового полиморфизма (простите, за мой русский)..
...
Рейтинг: 0 / 0
C++ разные реализации
    #38152348
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scymaksТак в том-то и дело, что хотелось на функциях такое сделать
указатель на функцию?

Код: plaintext
1.
2.
3.
4.
5.
void (*F_executeMethod) ();    
F_executeMethod = & SimpleMethod;
    ...
F_executeMethod();
    
...
Рейтинг: 0 / 0
C++ разные реализации
    #38152395
scymaks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

ха! Я об этом и не подумал)
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / C++ разные реализации
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]