Часть 2. Я начинающий, подскажите как...(Все вопросы начинающих!!!)
ListBox1->Columns=3;
каким образом записать строку в второй и третий столбцы?
те мне адо написать чтото вроде:
#include<string>
using namespace std;
#define
Во-первых, #define надо помещать сразу после #ifndef.
Во-вторых, не рекомендуется использовать директиву using namespace в заголовочных (.h) файлах, хоть компилятор этого и не запрещает. В заголовочных файлах рекомендуется вместо этого квалифицировать объект, что он относится к такому-то пространству имен. Т.е. вам (в этом файле) лучше везде, где вы пишете string, писать std::string, а using namespace std не использовать.
А в-третьих - насколько я знаю, в заголовочных (.h) файлах не следует помещать тело функции. Если нужно вынести функцию в отдельный файл, то в заголовочном файле надо прописать объявление (прототип) функции, а тело функции вынести в отдельный .cpp файл. Иначе, если вы не объявили функцию как inline, вы можете получить ошибку при компиляции / линковке (не помню точно на каком этапе) - что-то вроде "multiple definition".
Update. Вы написали раньше чем я написал это сообщение. Но хоть у вас (вроде как) всё получилось, то что я написал здесь не перестает быть актуальным. ;)
Во-вторых, не рекомендуется использовать директиву using namespace в заголовочных (.h) файлах, хоть компилятор этого и не запрещает. В заголовочных файлах рекомендуется вместо этого квалифицировать объект, что он относится к такому-то пространству имен. Т.е. вам (в этом файле) лучше везде, где вы пишете string, писать std::string, а using namespace std не использовать.
А в-третьих - насколько я знаю, в заголовочных (.h) файлах не следует помещать тело функции. Если нужно вынести функцию в отдельный файл, то в заголовочном файле надо прописать объявление (прототип) функции, а тело функции вынести в отдельный .cpp файл. Иначе, если вы не объявили функцию как inline, вы можете получить ошибку при компиляции / линковке (не помню точно на каком этапе) - что-то вроде "multiple definition".
Update. Вы написали раньше чем я написал это сообщение. Но хоть у вас (вроде как) всё получилось, то что я написал здесь не перестает быть актуальным. ;)
Буду иметь ввиду!
O_O вопрос еще в силе.
ИМХО этот вопрос не по C/C++, а по настройкам ОС, или IDE в которой вы программу делаете. ;)
Может файл создался как read-only, или вы пытаетесь сохранить а его держит какой-то другой процесс (возможно зависший в системе)?
Впрочем, такие "проблемы" надо бы самому уметь решать, вы же не первую неделю как сели за компьютер? ;)
Может файл создался как read-only, или вы пытаетесь сохранить а его держит какой-то другой процесс (возможно зависший в системе)?
Впрочем, такие "проблемы" надо бы самому уметь решать, вы же не первую неделю как сели за компьютер? ;)
я изменил фаил так как вы сказали после этого пытался сохранить и думал что ошибка было именно из-за кода,а не ос или иде.
вот код:
#define TO_H_
#include<string>
#include<windows.h>
std::string;
inline string to(const string str)
{
if(str.length() >= 1) {
char buf[str.length()];
CharToOem(str.c_str(), buf);
return string(buf);
}
return str;
}
#endif
#include "to.h"
using namespace std;
int main()
{
cout << to("коля");
return 0;
}
5 D:\Dev-Cpp\ïðîãè\to\to.h declaration does not declare anything
6 D:\Dev-Cpp\ïðîãè\to\to.h `string' does not name a type
D:\Dev-Cpp\ïðîãè\to\test_to.cpp In function `int main()':
7 D:\Dev-Cpp\ïðîãè\to\test_to.cpp `to' undeclared (first use this function)
наверно, правильнее using std::string; в данном случае или что-то такое.
С массивом символов тоже ерунда. Очень вероятно, что MinGW, который в DevCpp такое создание массивов и переварит, но другие компиляторы могут выдать error. Лучше использовать new и delete.
Так ошибка где собственно - при сохранении файла или при компиляции? Из ваших последних двух сообщений перед моим складывается впечатление что у вас просто файл сохранить не получается.
А насчет кода - вы неправильно поняли что я сказал:
Похоже вы подумали что достаточно изменить using namespace std на std::string и всё на этом. Применительно к вашему коду, то что я на самом деле имел в виду (может быть, неточно выразился), выглядит так:
#define TO_H_
#include<string>
#include<windows.h>
// std::string; удалить - это не нужно
inline std::string to(const std::string str)
{
if(str.length() >= 1) {
char buf[str.length()];
CharToOem(str.c_str(), buf);
return std::string(buf);
}
return str;
}
#endif
Кстати, вы про пространства имен читали хоть что-нибудь? Если нет то советую почитать. :)
этим сейчас и занимаюсь.
#define TO_H_
#include<string>
#include<windows.h>
// std::string; удалить - это не нужно
inline std::string to(const std::string str)
{
if(str.length() >= 1) {
char buf[str.length()];
CharToOem(str.c_str(), buf);
return std::string(buf);
}
return str;
}
#endif
сделал выводит ошибку:
D:\Dev-Cpp\ïðîãè\to\to.h In function `std::string to(std::string)':
10 D:\Dev-Cpp\ïðîãè\to\to.h `string' undeclared (first use this function)
2 D:\Dev-Cpp\ïðîãè\to\test_to.cpp In file included from D:\Dev-Cpp\ïðîãè\to\test_to.cpp
D:\Dev-Cpp\ïðîãè\to\to.h In function `std::string to(std::string)':
10 D:\Dev-Cpp\ïðîãè\to\to.h `string' undeclared (first use this function)
10-ю строчку в файле to.h не забыли исправить - там где было return string(buf), надо заменить на return std::string(buf)?
Update. Если все исправили и все равно не работает, то, скорее всего, эта ошибка означает, что для string просто нет подходящего конструктора чтобы создать новый string из char-овского массива buf.
А в-третьих - насколько я знаю, в заголовочных (.h) файлах не следует помещать тело функции. Если нужно вынести функцию в отдельный файл, то в заголовочном файле надо прописать объявление (прототип) функции, а тело функции вынести в отдельный .cpp файл. Иначе, если вы не объявили функцию как inline, вы можете получить ошибку при компиляции / линковке (не помню точно на каком этапе) - что-то вроде "multiple definition".
Хмм.. Хотелось бы чтобы народ прокомментировал сей спорный (для меня) момент. Насколько я знаю, хоть ты инклюдь h-файл, хоть .cpp хоть .doc - препроцессор подставит его и ему по-барабану на расширение. Можно кусок класса в h объявить а продолжение в cpp и должно работать.
Кто что скажет?
Update. Если все исправили и все равно не работает, то скорее всего эта ошибка значит что для string просто нет подходящего конструктора чтобы создать новый string из buf.
:D забыл. все работает. я понял, надо усиленней читать эту тему. :)
благодарствую!
Кто что скажет?
я изначально создал фаил .cpp с объявлениями и он у меня его не подставил. сохранил в .h и все заработало. я думаю он не зверь чтобы все подряд подставлять. :D
насчет половину там, половину сям думаю не прокатит.
Он был бы зверем в обратном случае. У вас кривые руки, а компилятору все равно какой файл вставлять в текущий с помощью #include.
:eek: честно говоря не знал что можно вставить любой фаил, хоть док.
Да, можно инклюдить файлы с любым расширением, если есть такое желание. Но устоявшейся практикой является использование для хедеров (то есть для тех файлов, которые будут инклюдиться в .cpp файлах) расширения.h (или .hpp если хедер содержит шаблонные функции или классы). Вроде бы это правило хорошего тона при составлении проектов...
А если хедер объявить как файл .cpp, и включить его в проект, то он будет компилиться как любой другой .cpp файл - отдельно от других файлов. В чём нет ничего хорошего, т.к. по своему назначению хедер (вернее его код) должен компилиться только в составе других файлов. ИМХО не исключено возникновение какой-нибудь ошибки при компиляции (может кстати потому у breeve и не получилось когда он хедер пытался с расширением .cpp использовать).
Кто что скажет?
Если говорить про классы (изначально разговор про функции был): можно, если тот кусок класса, который помещен в .h, содержит определение всех переменных класса, объявления и определения всех inline-функций класса, и объявления (но не определения!) всех не-inline-функций, а файл .cpp - определения не-inline функций класса. Ну и при условии что вы файл .cpp не пытаетесь инклюдить в другой .cpp файл.
Да, можно, но ИМХО лучше этой возможностью не пытаться пользоваться (разве что по необходимости - хотя мне в голову не приходит, для чего может понадобиться инклюдить, например, файл .doc). Во избежание путаницы и проблем лучше следуйте устоявшейся практике, и файлы-хедеры создавайте с расширением .h (или .hpp если в хедере шаблоны используете).
следующая беда:
во-первых, в книге все указатели задаются *, но опытным путем я понял, что так бывает не всегда, т.к сам компилятор вынуждал меня поменять некоторые звездочки на крышечки ^.
Так например, String ^s, а не String *s;
и char *sc;
Дак вот никак в инете найти не смог, а в книге вообще ничего нет про это, в чем разница между * и ^ ?:)
"Крышечки" ^ используются в так называемом "управляемом" - managed C++, он же C++.NET. Хотя в нём можно использовать и звёздочки *.
^ - это указатель на объект в управляемой куче - Handle to Object on Managed Heap.
Раз компилятор вынуждал применять ^, значит был создан проект CLR, под платформу Framework .NET.
Если нужен проект не под .NET, то следует при создании нового проекта выбирать MFC или Win32.
Определитесь, какой именно язык будете осваивать: C++ или C++.NET и используйте соответствующие книги.
PS: под .NET гораздо проще использовать C#.
PPS: или Nemerle
__gc class Atas
{
};
Но это работало в 2003 студии, в 2005 уже по другому. Компилятор выдает ошибку об устаревшем синтаксисе. Как подключить старый синтаксис я нашел, но как это записать в новом синтаксисе - нет.
Как?)
И кстати, в 2008 студии уже нельзя использовать ^ и * как одно и то же.
__gc class Atas
{
};
Но это работало в 2003 студии, в 2005 уже по другому. Компилятор выдает ошибку об устаревшем синтаксисе. Как подключить старый синтаксис я нашел, но как это записать в новом синтаксисе - нет.
Как?)
И кстати, в 2008 студии уже нельзя использовать ^ и * как одно и то же.
Чтобы создать управляемый класс (со сборкой мусора) его нужно объявить
Тогда экземпляр класса создаётся
Можно создать неуправляемый класс (без сборки мусора)
Экземпляр такого класса создаётся так
PS: Естественно, лучше использовать управляемые классы, со сборкой мусора.
вроде сделал по аналогии свои класс в разных файлах. и появляться ошибка линкера.
[Linker error] undefined reference to `Info::show()'
Погуглил что-то не нашел. вот код.
main.cpp:
#include "info.h"
using namespace std;
int main()
{
Info citatnik;
Info protocol("Protocol", "For get info you must download the book.");
citatnik.show();
protocol.show();
cin.get();
return 0;
}
info.h
#define _INFO_H_
#include<cstring>
using namespace std;
class Info
{
private:
string name, info;
public:
Info();
Info(string name, string info);
~Info();
void show();
};
#endif
info.cpp:
#include<cstring>
#include "info.h"
using namespace std;
Info::Info()
{
cout << "Default constructor is making a object\n";
name = "Default";
info = "Info is empty";
}
Info::Info(string name, string info)
{
cout << "Constructor is making a object\n";
name = "There must be a name";
info = "There must be a info about a company";
}
Info::`Info();
void Info::show()
{
cout << name<<endl;
cout << info<<endl;
}
подскажите.
подскажите.
Как компилируете? Если командная строка, то info.cpp надо явно указывать при компиляции.
компилятор dev-cpp.
вроде сделал по аналогии свои класс в разных файлах. и появляться ошибка линкера.
[Linker error] undefined reference to `Info::show()'
А перед тем, как выдаются эти ошибки линкера, у вас случаем не выдаются ошибки при компиляции? Это я к тому, что вы снова делаете ошибку, о которой я вам уже говорил - инклюдите cstring, а использовать пытаетесь объекты класса string, который из библиотеки string из C++.
а помоему cstring и string это одно и тоже. я причем пробовал несколько раз в других прогах и все работало четко и с этой и с той.
я включил цпп фаил в хидер. и у меня появилось много много ошибок. потом поменял директиву стринг на цстринг и ошибок не стало не больше не меньше. вот ошибки:
2 D:\Dev-Cpp\ïðîãè\mFC\main.cpp from D:\Dev-Cpp\ïðîãè\mFC\main.cpp
5 D:\Dev-Cpp\ïðîãè\mFC\info.cpp `Info' has not been declared
6 D:\Dev-Cpp\ïðîãè\mFC\info.cpp ISO C++ forbids declaration of `Info' with no type
D:\Dev-Cpp\ïðîãè\mFC\info.cpp In function `int Info()':
8 D:\Dev-Cpp\ïðîãè\mFC\info.cpp `name' undeclared (first use this function) (Each undeclared identifier is reported only once for each function it appears in.)
9 D:\Dev-Cpp\ïðîãè\mFC\info.cpp `info' undeclared (first use this function) 9 D:\Dev-Cpp\ïðîãè\mFC\info.cpp At global scope:
11 D:\Dev-Cpp\ïðîãè\mFC\info.cpp `Info' is not a class or namespace 12 D:\Dev-Cpp\ïðîãè\mFC\info.cpp ISO C++ forbids declaration of `Info' with no type
17 D:\Dev-Cpp\ïðîãè\mFC\info.cpp stray '`' in program
17 D:\Dev-Cpp\ïðîãè\mFC\info.cpp `Info' is not a class or namespace 17 D:\Dev-Cpp\ïðîãè\mFC\info.cpp expected constructor, destructor, or type conversion before ';' token
18 D:\Dev-Cpp\ïðîãè\mFC\info.cpp `Info' is not a class or namespace D:\Dev-Cpp\ïðîãè\mFC\info.cpp In function `void show()':
20 D:\Dev-Cpp\ïðîãè\mFC\info.cpp `name' undeclared (first use this function) 21 D:\Dev-Cpp\ïðîãè\mFC\info.cpp `info' undeclared (first use this function) D:\Dev-Cpp\ïðîãè\mFC\main.cpp In function `int main()':
7 D:\Dev-Cpp\ïðîãè\mFC\main.cpp expected `;' before "citatnik"
7 D:\Dev-Cpp\ïðîãè\mFC\main.cpp statement cannot resolve address of overloaded function
8 D:\Dev-Cpp\ïðîãè\mFC\main.cpp expected `;' before "protocol"
8 D:\Dev-Cpp\ïðîãè\mFC\main.cpp statement cannot resolve address of overloaded function
9 D:\Dev-Cpp\ïðîãè\mFC\main.cpp `citatnik' undeclared (first use this function)
10 D:\Dev-Cpp\ïðîãè\mFC\main.cpp `protocol' undeclared (first use this function)
еще я пробовал писать все в одном файле и ошибки те же самые.
Уточните пожалуйста, как инклюдите string, по какому из вариантов:
1. #include <cstring>
2. #include <string.h>
3. #include <string>
?
Если я не ошибаюсь, первые 2 варианта - это включение string из C, третий - string из C++.
1. #include <cstring>
2. #include <string.h>
3. #include <string>
?
Если я не ошибаюсь, первые 2 варианта - это включение string из C, третий - string из C++.
я пробовал всеми тремя и что-то ошибок других не вылезало.
info.cpp:
Это что за черточка? А где тело деструктора?
я это заметил потом исправил.
Странно, странно... Возможно что у вас string как-то по-другому подключается вашим IDE, независимо от того пишете ли вы string или cstring (и пишете ли вообще). И проблема не из-за string на самом деле...
Есть подозрение что у вас содержимое хедера просто пропускается, и не включается в файлы.
Для начала исправьте ошибку о которой сказал Kogrom.
Если все равно не скомпилится - то предлагаю провести такой эксперимент: закомментарить в info.h строчку #ifndef _INFO_H_ (и #endif в конце). Если после этого чудесным образом закомпилится, то значит надо смотреть настройки проекта - не объявлено ли у вас в defines _INFO_H_.
Вы закомментировали и #ifndef в начале и #endif в конце?
Можно еще и #define _INFO_H_ попробовать закомментировать.
А вообще - все-таки попробуйте покопаться в настройках проекта, может и в самом деле в defines у вас прописано _INFO_H_. Я вот попробовал у себя (создал проект с вашими тремя файлами) - если прописать в defines _INFO_H_, то начинают вылезать те же ошибки что и у вас. Если не прописывать (и исправить ошибку с деструктором) - то все компилится и работает.
Можно еще и #define _INFO_H_ попробовать закомментировать.
А вообще - все-таки попробуйте покопаться в настройках проекта, может и в самом деле в defines у вас прописано _INFO_H_. Я вот попробовал у себя (создал проект с вашими тремя файлами) - если прописать в defines _INFO_H_, то начинают вылезать те же ошибки что и у вас. Если не прописывать (и исправить ошибку с деструктором) - то все компилится и работает.
Я попробовал закомментить ifndef; ifndef и endif; ifndef, endif и define и у меня пишет все время 2 одинаковые ошибки и пишет их не переставая.
3 D:\Dev-Cpp\ïðîãè\mFC\info.h:4, from D:\Dev-Cpp\ïðîãè\mFC\info.cpp from D:\Dev-Cpp\ïðîãè\mFC\/info.h:4, from D:\Dev-Cpp\ïðîãè\mFC\/info.cpp
вот эти две ошибки он мне написал раз сто. :D
#define __thisfile_h_included__
// здесь инклуды, декларации и прочее
#endif // __thisfile_h_included__
Комментировать директивы от балды - есть большой грех. Приводит к ФГМ и общей слабости организма. Господин Ghox, очевидно практикует неправославное рукоблудие, иначе не стал бы советовать "попробовать закомментировать" все, что можно...
P.S. Столько мучений, от нежелания потратить 20 минут на изучение работы стандартных директив используемого компилятора.
#ifndef _INFO_H_
#define _INFO_H_
#include<string>
using namespace std;
class Info
{
private:
string name, info;
public:
Info();
Info(string name, string info);
~Info() {};
void show();
};
#endif
#include<iostream>
#include<string>
#include "info.h"
using namespace std;
Info::Info()
{
cout << "Default constructor is making a object\n";
name = "Default";
info = "Info is empty";
}
Info::Info(string name, string info)
{
cout << "Constructor is making a object\n";
name = "There must be a name";
info = "There must be a info about a company";
}
void Info::show()
{
cout << name<<endl;
cout << info<<endl;
}
#include<iostream>
#include "info.h"
#include "info.cpp"
using namespace std;
int main()
{
Info citatnik;
citatnik.show();
cin.get();
return 0;
}
Без комментариев.
Ув. Lerkin суров, но в общем-то справедлив, учту на будущее его замечание.
Признаю, что мое предложение такого эксперимента (с целью выяснить причины проблемы) является, в общем-то, глупостью и писать такое мне не стоило, а breeve надо было решать проблему, по-хорошему разобравшись с настройками и с основами составления проектов C++ (и вообще C++). Так что мои извинения Lerkin'у и breeve (и всем остальным кто читает этот раздел) за то, что вызвал праведный гнев (это к Lerkin-у) своим предложением глупого эксперимента, и за ложную наводку (это к breeve).
offtop. А почему господин? Господ здесь на форуме вроде нет, господа все в Париже. :rolleyes:
+1
Хоть я себя и дискредитировал, но выскажу свое мнение: я бы ТАК делать не советовал. :)
объявление структур typedef struct { } st; и struct st{};
последний вариант позволяет создавать ссылки на себя самих(для рекурсии) а вот какое принципиальное отличие в спецификаторе typedef кроме как расположения его после фигурак - не врубаюсь хоть убейте)