C++, mingw 3.5, class
#ifndef LR3CLASS_H
#define LR3CLASS_H
namespace anel
{
class Alfa
{
public:
Alfa();
~Alfa();
static void incCount();
static void decCount();
private:
static int count;
};
};
#endif
//lr3class.cpp
#include <iostream>
#include "lr3class.h"
using namespace anel;
int Alfa::count = 0;
Alfa::Alfa()
{
incCount();
if (Alfa::count == 1)
std::cout << "This is first object. [Constructor]" << std::endl;
}
Alfa::~Alfa()
{
decCount();
if (Alfa::count == 0)
std::cout << "This is last object. [Destructor]" << std::endl;
}
void Alfa::incCount()
{
++count;
}
void Alfa::decCount()
{
--count;
}
//lr3.cpp
#include <iostream>
#include <conio.h>
#include "lr3class.h"
void testClass();
int main()
{
testClass();
getch();
return 0;
}
void testClass()
{
anel::Alfa first;//, second, third;
}
Компилятор ругается: undefined reference to 'anel::Alfa::Alfa()'
undefined reference to 'anel::Alfa::~Alfa()'
Второй вариант - бинарник полученный в результате компиляции файла lr3class.cpp не линкуется к результирущему. Или что еще хуже - он вобще не скомпилирован.
Покажите как осуществляете сборку всего проекта.
#include <conio.h>
#include "lr3class.h"
void testClass();
int main()
{
testClass();
getch();
return 0;
}
void testClass()
{
[COLOR="Red"]anel::Alfa first;[/COLOR]//, second, third;
}
меня смущает отсутствие скобок [COLOR="Red"]()[/COLOR]: ты что обозначил переменую и даже не инициализировал и ищешь что бы что-то работало? не понимаю
почитай литературу по с++ про классы . К сожалению ты не понял как с классами работать . поэтому там куча ошибок .
to qwone
А чем тебя смущало отсутствие скобок?
Не нужно валить вину на Dev-C++. Если включить в проект все нужные файлы *.cpp и *.h (с помощью GUI), то все должно работать. Вероятно, вы это не сделали.
1. Закрываю открытые файлы
2. Создаю консольный проэкт
3. Добавляю туда два срр-файла , которые хочу скомпоновать -
// на несколько модулей, упростив написание и проверку; Этот
// модуль содержит функцию, вызываемую из main()
#include<stdio.h>
#include<iostream.h>
// sumSequence - суммирует последовательность введённых с
// клавиатуры чисел, пока не будет введено отричательное число.
// Возвращает сумму введённых чисел
int sumSequence(ostream& out, istream in)
{
// вечный цикл
int nAccumulator=0;
for(;;)
{
// ожидание следующего числа
int nValue=0;
out << " Введите следующее число: /n";
in >> nValue;
// …Если число отрицательное ...
if(nValue<0)
{
//... тогда выполнить выход из цикла
break;
}
// В противном случае добавить число к аккумулятору
nAccumulator+=nValue;
}
// вернуть сумму
return nAccumulator;
}
}
- Это первый файл,
// на несколько модулей, упростив написание и проверку; Этот
// модуль содержит функцию main()
#include<stdio.h>
#include<iostream.h>
int sumSequence(ostream& out, istream& in);
int main(int nArg, char* pszArgs[])
{
cout <<" Эта программа суммирует последовательности /n"
<<" чисел. Вводпоследовательности можно прекратить,/n"
<<" введя отрицательное число./n"
<<" Остановить программу можно, /n /n"
<<" введя два отрицательных числа подряд /n";
// накопление последовательности чисел ...
int nAccumulatedValue;
do
{
// сложить числа введённые с клавиатуры
cout <<"/n Введите следующую последовательность/n";
nAccumulatedValue=sumSequence(cout,cin);
// вывести полученный результат
cout <<"/n Сумма равна "
<< nAccumulatedValue
<<"/n";
// ...пока сумма не равна нулю
} while (nAccumulatedValue !=0);
cout <<"/n/n/n/n Программа завершена. /n Пока.. /n";
return 0;
}
- это второй.
При компиляции каждого из этих файлов в отдельности проблем не возникает ( то есть компилятор выдаёт какие-то там сообщения, но они такие же как и в других "рабочих" программах). А как получить из них один ехе-файл - немогу дорубить.
// на несколько модулей, упростив написание и проверку; Этот
// модуль содержит функцию, вызываемую из main()
#include<cstdio>
#include<iostream>
// sumSequence - суммирует последовательность введённых с
// клавиатуры чисел, пока не будет введено отричательное число.
// Возвращает сумму введённых чисел
using namespace std; // 2 !!!
int sumSequence(ostream& out, istream& in) // 1 !!!
{
/* ... */
}
}
// на несколько модулей, упростив написание и проверку; Этот
// модуль содержит функцию main()
#include<cstdio>
#include<iostream>
using namespace std; // 2 !!!
int sumSequence(ostream& out, istream& in); // 1 !!!
int main(int nArg, char* pszArgs[])
{
/* ... */
}
1) Разница в заголовке функций: в одном случае второй параметр передается по значению, во втором по ссылке
2) ostream, istream, cout, cin не пренадлежат глобальному пространству имен. Вместо using namespace std бывает полезно использовать префикс std::. Например:
int a;
std::cout<<"enter value ";
std::cin>>a;
/* ... */
вставил using namespace std; - без изменений, попробовал префиксный вариант - ничего. max_dark боюсь вы переоцениваете мой опыт и знания языка . До этого момента я не создавал проектов, только отдельные програмки. Мне кажется что я просто не знаю какие кнопки, и в какой последовательности необходимо нажимать в Dev C++ для
1) создания проекта
2) добавления внего файлов
3) компиляции всей сборки
Например на этапе добавления : добавлять необходимо оба файла, и MainModule.cpp и SeparateModule.cpp , или только MainModule.cpp ?
При создании проекта в окошке редактора появляется заготовка main.cpp . Но ведь у меня же есть своя функция main .Следует ли удалить из проекта main.cpp , и оставить MainModule.cpp ? или необходимо оставить обе функции main ? А может нужно отредактировать main.cpp до MainModule.cpp , а не заменять один на другой ?
После добавления файлов в проект ( слева, в окне проектов ), необходимо просто нажать [скомпилировать и выполнить], или сначала нужно открыть какие-то файлы в окне редактора ? А может , перед компиляцией требуется создать один, общий срр-файл, включив в него MainModule и SeparateModule ? (Но в таком случае непонятно в чём смысл создания проекта, и чем он отличается от отдельной програмки ? )
вставил using namespace std; - без изменений, попробовал префиксный вариант - ничего. max_dark боюсь вы переоцениваете мой опыт и знания языка . До этого момента я не создавал проектов, только отдельные програмки. Мне кажется что я просто не знаю какие кнопки, и в какой последовательности необходимо нажимать в Dev C++ для
1) создания проекта
2) добавления внего файлов
3) компиляции всей сборки
Например на этапе добавления : добавлять необходимо оба файла, и MainModule.cpp и SeparateModule.cpp , или только MainModule.cpp ?
Добавлять оба файла
При создании проекта в окошке редактора появляется заготовка main.cpp . Но ведь у меня же есть своя функция main .Следует ли удалить из проекта main.cpp , и оставить MainModule.cpp ? или необходимо оставить обе функции main ?
Двух функций main быть не должно.
А может нужно отредактировать main.cpp до , а не заменять один на другой ?
Можно как удалить main.cpp(и добавить в проект MainModule.cpp) так и заменить код в нем кодом из MainModule.cpp(при этом добавлять MainModule.cpp в проект не надо)
После добавления файлов в проект ( слева, в окне проектов ), необходимо просто , или сначала нужно открыть какие-то файлы в окне редактора ? А может , перед компиляцией требуется создать один, общий срр-файл, включив в него MainModule и SeparateModule ? (Но в таком случае непонятно в чём смысл создания проекта, и чем он отличается от отдельной програмки ? )
Требуется только нажать [скомпилировать и выполнить], открывать какие либо файлы не обязательно
меня смущает отсутствие скобок [COLOR="Red"]()[/COLOR]: ты что обозначил переменую и даже не инициализировал и ищешь что бы что-то работало? не понимаю
Усугублю.
Скобки в том месте не просто необязательны, а вредны!
Нельзя там скобки писать, да и незачем. Это будет семантической ошибкой.
При запуске моего проекта компилятор, кроме обычных сообщений выдал такое :
для файла :
D:\INSTALL\Dev-Cpp\include\c++\3.4.2\backward\backward_warning.h
сообщение:
ld returned 1 exit status
, и для файла:
D:\MY_DOC\Програмер\Разделение программы\Makefile.win
такое сообщение:
[Build Error] ["Проект] Error 1
Кроме этого было сообщение без адреса:
[Linker error] undefined reference to `sumSequence(std::ostream&, std::istream&)'
(здесь D:\INSTALL\Dev-Cpp\ - директория куда установлен Dev-C++
, а здесь D:\MY_DOC\Програмер\Разделение программы -находятся созданные программы )
Судя по всему все ошибки связанны с компоновкой двух файлов.
Но что же здесь не так?