Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Ряд вопрсов по C++.

Автор: renesko1 10.04.2008 20:58

Вопрос 1.

А также сказать, сколько занимает в памяти следующий объект:



class A
{
int i; 2 byte
short s; 1 byte
static int si; 2 byte
virtual void vf(); 1 byte
}




Итого : 6 байтов правилбно ?

ps
Я только начал изучать С++ поэтому порой буду задавать простые и глупые вопросы.

Автор: volvo 10.04.2008 21:22

Во-первых, это машинно- и компиляторо-зависимо (у меня на машине sizeof(int) = 4, а не 2), во-вторых зависит также от установок выравнивания (если откомпилировать без ничего, результат будет один, если с #pragma pack(1) - то результат другой), ну и в третьих, кто тебе сказал что виртуальная функция тоже что-то занимает, и это надо считать?

Автор: renesko1 10.04.2008 21:30

эээ ну я ... не знаю ....
+ у меня вопрос можно ли здесь еще задавать небольшие вопросы или создовать новую тему ?

Автор: klem4 10.04.2008 21:33

Если будет много небольших вопросов, то лучше в этой ветке задавай, только нумеруй их тогда, чтобы не возникло путаницы при ответах и тему переименуй в "Ряд вопросов по с++" например.

Автор: renesko1 10.04.2008 22:14

Вопрос 2.
Не могу точно для себя понять зачем перед методами в классе ставить void ?

Автор: DocNo 10.04.2008 22:36

не обязательно void.
можно и int.

Автор: volvo 10.04.2008 22:38

Чтобы объяснить компилятору, что метод ничего не возвращает. Вот синтаксис такой...

Автор: renesko1 10.04.2008 23:05

Вопрос 3.
Вот написал класс описввающий фигуру rectangle.
Он условен но меня волнует правильность.


classe rectangle {
int width, length ;
public :
rectangle (int, int) ;
void draw (int, int) ;
Int Calcarea () ;
Int CalcDiagonal () ;
}
//***************************************************
rectangle::rectangle (int w, int l) ;
{ if (w < 0) or (l < 0)
then { cout << " Error input data/n " ; exit ; }
width = w ;
length = l ;
}
//****************************************************
Int rectangle::Calcarea() ;
{ return width * length }
//****************************************************
void rectangle::draw (int x , int y) ;
{ rectangle(x, y, x + length, y + width) }
//****************************************************
Int rectangle::CalcDiagonal () ;
{ return sqrt(sqr(width) + sqr(length)) }
//************************end*******************************


Автор: volvo 10.04.2008 23:26

Цитата
меня волнует правильность.
В каком смысле "правильность"? Синтаксически пример неправильный, так что компилятор его не пропустит: отсутствуют точки с запятой в конце каждой строки, и после описания класса (а там, где они не нужны - присутствуют), слова then в С/С++ просто нет, так же как и функции sqr, ну и case-sensitivity языка тоже не даст программе откомпилироваться, если используешь тип int, то это не должен быть ни Int , ни INT... А только маленькими буквами...

Ну, а логически - фрагмент слишком маленький, чтобы что-то сказать...

P.S. Очень похоже на попытку дословного перевода с Паскаля...

Автор: renesko1 10.04.2008 23:32

Просто до этого у меня была монополия pascal

Автор: мисс_граффити 11.04.2008 4:31

class, не classe

Автор: AlonZo 11.04.2008 12:36

У меня тоже вопрос. Есть некий txt файл с числами, расположенными по числу на каждой строке, например:
1
2
3
И простая программа, которая считывает эти числа и выводит на экран. Проблема в том, что последяя цифра в файле дублируется и еще раз выводится. Что я не так делаю?

#include <iostream.h>
#include <conio.h>
#include <fstream.h>
int main()
{
int price;
clrscr();
ifstream in("Input.txt");
while(!in.eof())
{
in>>price;
cout<<price<<endl;
}
in.close();
getch();
return 0;
}

Т.е. результатом будет:
1
2
3
3 //Почему дублирует?

Автор: volvo 11.04.2008 13:13

Цитата
Почему дублирует?
Потому, что последняя строка - пустая... После прочтения последнего числа (тройки) конец потока еще не достигнут, значит, происходит попытка считать еще одно число. А не получилось, price остается прежним, печатается, и только теперь in.eof() возвращает истину... Чтобы избежать дублирования, подправляем чуть-чуть:

    while(in >> price) {
cout<<price<<endl;
}
in.close();


Автор: renesko1 11.04.2008 18:57

Спасибо, мисс_граффити и volvo, я купил себе наконец то книжку и теперь понимаю что за бред я понаписал.

Автор: renesko1 15.04.2008 23:08

Вопрос 4.



Как передать в функцию сточку для работы с ней ?

Автор: volvo 15.04.2008 23:19

Смотря что ты подразумеваешь под "строчкой" - это может быть и char *, и std::string, я уж не говорю о других обертках, которых в каждом компиляторе/библиотеке куча...

Если char *, то вот так, скажем:

...
void p(char *s) {
s[0] = '2'; // изменяешь строку
}

int main() {
char s[20] = "start\0";
p(s);
cout << s << endl; // печатаешь измененную

return 0;
}

Автор: renesko1 15.04.2008 23:26

Ясно.

Автор: renesko1 21.04.2008 0:09

Вопрс 5.
"Написать иерархию классов, которые в конструкторе принимает строку и у которых есть открытый метод print, которые выводят эту строку на экран или в файл на диск."

Честно пытался понять, но както так не очень далеко ушел.
Можно хотя бы легкий пример.


Автор: volvo 21.04.2008 0:41

Не совсем понятно, зачем тут иерархия, это прекрасно делается в одном классе:

#include <iostream>
#include <fstream>

class base {
std::string s;
friend std::ostream& operator << (std::ostream&, const base&);
public:
base(const std::string& st): s(st) {
}

void print(std::ostream& os) {
os << s;
}
};

std::ostream& operator << (std::ostream& os, const base& b) {
os << b.s;
return os;
}


int main() {
base b("hello, world!");
b.print(std::cout); // выводим на экран

std::ofstream out("file.txt", std::ios::out); // создаем файл ...
b.print(out); // ... и пишем строку туда
out.close();

return 0;
}


Автор: Bo2nik 22.04.2008 22:39

Вопрос 6.

Объясните, пожалуйста, почему в отличие от функции printf() аргументами для функции scanf() могут быть только адреса объектов программы, в частном случае - адреса ее переменных. Глупый вопрос, но буду очень признателен.

Автор: volvo 22.04.2008 23:07

Ну, наверное все-таки потому, что printf не меняет входные параметры, они копируются в стек и выводятся на печать, а scanf как раз-таки должна значения параметров изменить (в этом и состоит ее задача), а сделать это можно только передав ссылку или указатель на аргумент (ссылок в чистом С еще не было, остаются только указатели).

Автор: alfons 24.04.2008 20:53

Дейтел. Как программировать на СИ. Очееееень подробная книга. Все очень просто, с примерами и заданиями!

Автор: blackhard 29.04.2008 20:31

Короче вот какой вопрос.У меня есть структура и указатель на нее по ходу выполнения мне надо под нее выделять память.Я решил сначало попробовать на простом примере



struct cel
{
int znac;
char name[NAME];//вот структура
}*CP;


............................................................
CP=(struct cel*)malloc(sizeof(struct cel ));
realloc(CP,2*sizeof(struct cel ));
CP[0].znac=20;
printf("%d",CP[0].znac);
free(CP);//при выполнении данной ф.и вылетает


Сначала выделяю память под 1 элемент.Подом добавляю памяти под второй.Так вот все ли я делаю правильно?И как потом эту память очистить? free(CP) не прокатывает.

Автор: volvo 29.04.2008 20:40

Скажи спасибо альфонсу, который посоветовал прочесть книгу Дейтела... Читай, наверное ее чтение само собой сделает свое дело, и ты больше не будешь задавать вопросов по С++... Там же все очень просто? Ну, так в чем дело?

Читаешь книгу, идешь спать... Проснулся - С++ стал тебе родным... Идиллия, правда? И главное - без усилий с твоей стороны, достаточно только прочитать, ведь "все ОЧЕНЬ просто!" (С) dry.gif

Автор: blackhard 29.04.2008 20:47

Цитата(volvo @ 29.04.2008 17:40) *

Скажи спасибо альфонсу, который посоветовал прочесть книгу Дейтела... Читай, наверное ее чтение сделает свое дело, и ты больше не будешь задавать вопросов по С++... Там же все очень просто? Ну, так в чем дело?

Да в том что неполучается освободить память после realloc на ф.и free(CP) выдается сообщение о том что обнаружена ошибка.

Добавлено через 2 мин.
Блин ну я и тупой........Всегото надо CP=(struct cel*)realloc(CP,2*sizeof(struct cel ));

Автор: blackhard 29.04.2008 22:00

Если кому надо могу выложить Дейтела в электронном виде!!!

Автор: renesko1 1.05.2008 18:52

Я смотрю тема стала очень популярной smile.gif
Извините за флуд.

Автор: renesko1 8.05.2008 21:15

Вот еще попрос в паскале, когда пишешь модуль с обьектом переменные(обекта) видны во всех процедурах и тд.
А в с++ как надо сделать что бы переменная была видна на весь модуль ?

Автор: volvo 8.05.2008 22:43

В С++ надо описать поле класса общим (в секции public) или пользоваться struct-урами, там поля общие по умолчанию, если не задашь другой метод доступа...

А вообще, это плохой стиль - давать всем подряд обращаться к полям класса. Лучше сделай Getter/Setter этой переменной, и дай им общий доступ, а саму переменную скрой в private-секции (так у тебя будет хоть какой-то контроль за тем, как изменяется поле класса; ведь может быть ситуация, что поле нельзя изменять, и вдруг какая-то посторонняя процедура берет и меняет его... Setter не должен ей этого позволить, если это на данный момент недопустимо)

Автор: renesko1 8.05.2008 22:56

Нет ты, к сожалению, не так меня понял. Я имею возможность обращатся в метадах обьекта напрямую не
записывая в параметры мою переменную.
А так, да, конечно, если сделать обращение напрямую, потом не разберешся, что где когда меняешь.

Автор: volvo 8.05.2008 23:31

Цитата
Я имею возможность обращатся в метадах обьекта напрямую не записывая в параметры мою переменную.
В методах объекта и в С++ ты можешь общаться со всеми полями напрямую... Разговор был о "снаружи", не правда ли?
Цитата
что бы переменная была видна на весь модуль
(на модуль, а не на класс, чувствуешь разницу?)

Или
class base {
int value;

public:
base(int val = 0): value(val) {}
int getValue() const {
return value;
}
};


и читай переменную, сколько влезет, но записать в нее тебе никто не даст (только изнутри класса или friend-function)... Или, если хочешь программировать в стиле Паскаля:
class base {
public:
int value;

base(int val = 0): value(val) {}
};
или
struct base {
int value;

base(int val = 0): value(val) {}
};
, и работай отовсюду...

Автор: renesko1 9.05.2008 0:17

Как всегда помог, да ты прав, постараюсь в след. раз лучше формулировать вопрс. smile.gif

Автор: DocNo 20.05.2008 20:37

у меня вопрос
когда я должен вводить символы я ставлю условии на неналичие в них цифр
вот так


char name[20];
i:
scanf("%s",name);
for(int i = 0; i<20; i++)
if((name[i]>47) && (name[i]<58))
{gotoxy(x,1);
memset(name,'\0',20);
goto i;}


тут все замечательно

теперь я хочу сделать наоборот вводить цифры с условием на неналичие символов кроме цифровых
вот так

short day[2];
d:
scanf("%d",day);
for(i = 0; i<2; i++)
if((day[i]<48) || (day[i]>57))
{gotoxy(x,2);
memset(day,'\0',2);
goto i;}

но в далном случае прога виснет.
подскажите что не так)

Автор: volvo 20.05.2008 21:09

blink.gif
Ты ж читаешь число, а не строку через scanf("%d"), а работаешь с day, как со строкой? Это во-первых... Во вторых: что за метка?

Достаточно было сделать вот так:

  char buffer[256]; // Это для сбрасывания введенной строки, которая НЕ является числом

int day;

while(!(scanf("%d",&day))) {
gotoxy(x, 2);
day = -1; // Ну, или любое другое значение, неважно
gets(buffer); // убираем из буфера строку, чтобы читать заново
puts("Ошибка. Попробуйте еще раз... ");
};


Автор: DocNo 20.05.2008 21:31

а зачем адрес брать у дня?

Автор: volvo 20.05.2008 22:06

Это ты у разработчиков С спрашивай, зачем им понадобилось, чтобы scanf работала с адресами... Наверное, чтобы введенное значение можно было вернуть из функции. Иначе зачем scanf вообще нужна?

Автор: blackhard 28.05.2008 22:45

А если у ф.и вот такой протатип

int sum2(int k,int(*p)(int,...),...)
(где k количество параметров).Как мне внутри этой ф.и передать необязательные параметры ... в ф.ю на которую указывет этот указатель int(*p)(int,...), и в которой тоже переменное число параметров?Можно так вообще сделать или нет?

Автор: volvo 28.05.2008 23:50

Цитата
Можно так вообще сделать или нет?
Можно... Вот так, например:
#include <stdio.h>
#include <stdarg.h>

typedef int (*myFunc)(int ...);

int t(int k ...) {
int sum = 0;

va_list vL;
va_list *pvL;

va_start(vL, k);
pvL = va_arg(vL, va_list*);

for(int i = 0; i < k; i++) {
sum += va_arg(*pvL, int);
}
va_end(vL);
return sum;
}

int s(int k, myFunc f ...) {
va_list vL;
va_start(vL, f);
int result = f(k, &vL);
va_end(vL);

return result;
}

int main() {
int i = s(5, t, 10, 20, 30, 40, 150);
printf("%d\n", i);
return 0;
}

Автор: compiler 14.06.2008 21:38

Вопрос #7
Вот есть программа, от которой я хотел бы составление последовательностей и вывод этого чуда.. Но увы она этого не делает( Наверно опять начудил с индексами.. Помогите..

#include <iostream>
#include <vector>
#include <cstdlib>
using namespace std;
int main(void){
const int number_el(6); //количество элементов
const int number_seq(6); //количество последовательностей

vector<int> fibonacci(number_el);//ряд Фиббоначи
fibonacci[0]=1;
fibonacci[1]=1;
for(int i(2); i<number_el; ++i)
fibonacci[i]=fibonacci[i-2]+fibonacci[i-1];

vector<int> lucas(number_el);//ряд Лукаса
lucas[0]=1;
lucas[1]=3;
for(int i(2); i<number_el; ++i)
lucas[i]=lucas[i-2]+lucas[i-1];

vector<int> pell(number_el);//ряд Пелла
pell[0]=1;
pell[1]=2;
for(int i(2); i<number_el; ++i)
pell[i]=pell[i-2]+2*pell[i-1];

vector<int> triangular(number_el);//ряд Треугольных чисел
for(int i(0); i<number_el; ++i)
triangular[i]=(int)(0.5*(i*i+3*i+2));

vector<int> square(number_el);//ряд Квадпатных чисел
for(int i(0); i<number_el; ++i)
square[i]=i*i+2*i+1;

vector<int> pentagonal(number_el);//ряд Пятииугольних чисел
for(int i(0); i<number_el; ++i)
pentagonal[i]=(int)((3*i*i+5*i+2)/2);;

vector<int> *seq_addrs[ number_seq ]={
&fibonacci, &lucas, &pell, &triangular, &square, &pentagonal
};


/*string seq_names[ number_seq ] = {
"Фибоначчи", "Лукас", "Пелл", "Треугольный", "Квадратгый", "Пятиугольный"
};*/

for(int i(0); i<number_seq; ++i){
for(int j(0); i<number_el; ++j)
cout << (*seq_addrs[i])[j] << '\t';
cout <<'\n';
}

cout << "Ok\n";
return 0;
}


заранее благодарен.

upd
подправлены формулы для треугольных и квадратных чисел, добавлено явное привидение типов.

Автор: volvo 14.06.2008 22:06

		for(int i(0); i<number_seq; ++i){
for(int j(0); i<number_el; ++j) // Тут точно все, как надо? Может I не нужно?
cout << (*seq_addrs[i])[j] << '\t';
cout <<'\n';
}
Кстати, обрати внимание на предупреждение... Лучше приводить результат к типу int явным образом...

Автор: compiler 14.06.2008 22:27

Цитата(volvo @ 14.06.2008 18:06) *
Тут точно все, как надо? Может I не нужно?
точно.. спасибо..
Цитата(volvo @ 14.06.2008 18:06) *
Кстати, обрати внимание на предупреждение... Лучше приводить результат к типу int явным образом...
а вот тут не понял( ты с какими ключами компилируешь?

Вопрос #7.1
это нормально вызывать конструктор для i несколько раз или этого надо избегать?

Автор: volvo 14.06.2008 22:43

Цитата
а вот тут не понял( ты с какими ключами компилируешь?
С какими бы ключами ты не компилировал, попытка сделать:

vector<int> triangular(number_el); //ряд Треугольных чисел
for(int i(0); i<number_el; ++i)
triangular[ i ]=0.5*(i*i+3)+1; // int <- double

на уважающем себя компиляторе приведет к Warning-у... Я компилирую с -Wall (причем всегда...), GCC 3.4.5 + Code::Blocks

Цитата
это нормально вызывать конструктор для i несколько раз или этого надо избегать?
Избегать за счет предварительного описания переменной что-ли? Я все-таки предпочитаю делать время жизни переменной минимальным... Кстати, почему именно такая форма? Вот так не проще для восприятия:
for(int i = 0; i < number_el; ++i) {
...

?

Автор: compiler 14.06.2008 23:10

Цитата(volvo @ 14.06.2008 18:43) *
С какими бы ключами ты не компилировал, попытка сделать... на уважающем себя компиляторе приведет к Warning-у...
хм.. мой g++ (GCC) 4.2.3 (Ubuntu 4.2.3-2ubuntu7) ничего не говорит, даже с -Wall((
Цитата(volvo @ 14.06.2008 18:43) *
Избегать за счет предварительного описания переменной что-ли?
да.. должно, наверно, экомится время на конструктор/деструктор.. или оно ничтожно?
Цитата(volvo @ 14.06.2008 18:43) *
Вот так не проще для восприятия..
Лично мне все равно)) Ну, а потом, этот способ остался для совместимости с Си, насколько мне известно..

зы
в программе есть еще ошибки по заполнению ряда, но не в них сейчас суть)

Автор: volvo 15.06.2008 0:29

Цитата
да.. должно, наверно, экомится время на конструктор/деструктор.. или оно ничтожно?
Можешь объяснить, с чего ты взял, что i = 0 ("оператор =") будет выполняться быстрее, чем конструктор для POD-типа, которым является int? rolleyes.gif

Цитата
Ну, а потом, этот способ остался для совместимости с Си, насколько мне известно..
Какой именно? Тот, которым пользуешься ты? Стандарт С++ открой, и посчитай, сколько там таких способов... А сколько - присваивания smile.gif

Автор: compiler 15.06.2008 15:31

Цитата(volvo @ 14.06.2008 20:29) *
Можешь объяснить, с чего ты взял, что i = 0 ("оператор =") будет выполняться быстрее, чем конструктор для POD-типа, которым является int? rolleyes.gif
я имел немножко другое, может лучше один раз объявить i, а потом один раз вызвать деструктор?
Цитата(volvo @ 14.06.2008 20:29) *
Какой именно? Тот, которым пользуешься ты? Стандарт С++ открой, и посчитай, сколько там таких способов... А сколько - присваивания smile.gif
насчет наследования Си, я руководствывался Липпманом*(это конечно не стандарт))). Там же несколько "преимуществ" нововведенного способа. Хотя сам Липпман, в последующих листингах пользуется оператором присваиванияblush.gif

*-Стэнли Липпман "Основы программирования на С++". Издательство "Вильямс" 2002год. глава 1.2 (страница 26, 6-я строка)
Цитата
Использования для инициализации оператора присваивания (=) унаследовано от языка С.

Автор: volvo 15.06.2008 15:41

Цитата
я имел немножко другое, может лучше один раз объявить i, а потом один раз вызвать деструктор?
Еще раз: в каждом цикле (в разделе инициализации, до первой точки с запятой оператора for) для объявленного тобой где-то сверху i будет вызываться "operator ="? Будет, иначе ты не присвоишь i правильное стартовое значение... Вопрос: кто тебе сказал, что для int конструктор будет выполняться медленнее, чем "operator ="?

Автор: compiler 15.06.2008 15:49

Цитата(volvo @ 15.06.2008 11:41) *
.. Вопрос: кто тебе сказал, что для int конструктор будет выполняться медленнее, чем "operator ="?
хм.. не знаю)
а как вообще можно засеч время выполнения программмы(урывка) на с++ ? (это вопрос #8 )

Автор: volvo 15.06.2008 16:44

Цитата
как вообще можно засеч время выполнения программмы(урывка)

Попробуй:
#include <ctime>
...
clock_t t_start = clock();

// здесь идет сам код ...

clock_t t_finish = clock();
cout << "Время выполнения = " <<
(static_cast<float>(t_finish - t_start)/CLOCKS_PER_SEC) << " секунд" << endl;

(можешь не делить на CLOCKS_PER_SEC, получишь время в тиках процессора)

Автор: compiler 15.06.2008 21:56

Цитата(volvo @ 15.06.2008 12:44) *
Попробуй..
спасибо..теперь буду знать..

Автор: compiler 17.06.2008 18:55

прошу прощения.. дурацкая ошибка... назвал счетчик cout..

Автор: volvo 17.06.2008 19:05

Цитата
почему все так?(
Потому что:
	int cout(0); // <--- cout здесь - это int
...
cout << endl << "Вектор:" << endl; // Что бы ЭТО значило ???


Автор: compiler 17.06.2008 19:11

Цитата(volvo @ 17.06.2008 15:05) *
Потому что:
спасибо, дкрацкое название выбрал дя переменной.. может буду теперь писать std::cout)

Автор: Вофka 21.06.2008 19:33

c++
Помогите пожалуйсто!
Нужно решение двух задач для зачета:
1Матрица:
Получить целочисленную квадратную матрицу порядка 7, элементами которой являются числа 1, 2, ..., n, расположенные в ней по спирали.
2Рекурсия:
Пусть
x(1)=y(1)=1;x(i)=x(i-1)+y(i-1)/i^2;
y(i)=y(i-1)+x(i-1)/i,i=2,3,...
Получить x(n),y(m), если n, m -натуральные.
Зарание спасибо

Автор: renesko1 30.06.2008 0:53

вопрос № n ;
Как подключить свой модуль к програме ?

Автор: klem4 30.06.2008 1:07

файл положи в папку с основным cpp файлом и

 #include "myfile.h"; 


например ...

Автор: renesko1 12.07.2008 18:54

У меня вопрос, как сделать это с шаблонам ?

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

Мне не нужен код, а какой нибудь пример на заданную тему ...


#include <string>
#include <iostream>
#include <fstream>
#include<memory>
using namespace std ;
//******************************************************************
class base {
public :
virtual void print () = 0 ;
} ;
//***************************************************************

class printmonitor : public base {
string outString ;

public :
printmonitor (const string& userString) {outString = userString;}
void print () {cout << outString ;}
~printmonitor () ;
} ;
//***************************************************************

class printinfile : public base {
string outString ;

public :
printinfile (const string& userString ) {outString = userString ;}
void print () ;
~printinfile() ;
} ;

//***************************************************************

void printinfile::print () {


ofstream out("outfile.txt",ios::out) ;
if(!out) {cout <<"Cannot open file test for writing " << endl ; }
out << outString ;
out.close () ;
}
//***************************************************************
int main()
{

//pprintmonitor = new printmonitor("test my program 1");
//pprintinfile = new printinfile("test my program 2");
auto_ptr<base> pprintmonitor (new printmonitor("test my program 1")) ;
auto_ptr<base> pprintinfile (new printinfile("test my program 2")) ;
pprintmonitor->print();
pprintinfile->print();

//delete pprintmonitor;
//delete pprintinfile ;

return 0 ;
}


Автор: renesko1 12.07.2008 19:43

Ладно более конкретный вопрос..
"класс имеет необходимую функцию " - те функцию print() или перегруженный оператор << ?
"идет проверка времени компиляции" - как она осуществляется , ну или что это такое ?

Автор: volvo 12.07.2008 20:32

cool.gif

#include <iostream>
// для VC придется добавить еще и <assert.h>

using namespace std;

class myA {
public:
void Print() {
cout << "first Print()" << endl;
}
};

class myB {
public:
void Print() {
cout << "second Print()" << endl;
}
};

class myC {
public:
void Oops() {
;
}
};


template<class T>
class TBase
{
bool ValidateRequirements()
{
void (T::*test)() = &T::Print;
test;
return true;
}

public:
~TBase()
{
assert( ValidateRequirements() );
}

// ...
};


int main() {
TBase<myA> first; // Ok
TBase<myB> second; // Ok
TBase<myC> third; // ha-ha : )

return 0;
}



Вот такое сообщение:
Цитата
error: `Print' is not a member of `myC'

достаточно информативно?

Автор: renesko1 12.07.2008 20:58

smile.gif Как всегда помог, спасибо, а то у меня уже всё кипеть начинало, до меня просто суть задания не правильно дошла. Всмысле отказатся от иерархии и сделать через шаблоны, а я, как дурак, хотел совместить.

Автор: renesko1 23.08.2008 21:49

mingw.
У меня вопрос: есть ли встроенная графическая библиотека, мне достаточно вывода линий, кругоd и тд, те.
примерно как модуль graph в pascale.

Автор: volvo 23.08.2008 22:10

Простого встроенного - нет. Есть эмуляторы BGI: http://codecutter.org/tools/winbgim/index.html , есть OpenGL + GLUT, есть WinAPI...

Автор: renesko1 23.08.2008 22:42

Спасибо за ссылку, всё работает).

Автор: renesko1 23.08.2008 23:47

Хм.. Я добавил graphics.h и winbgim.h и в ...\mingw\include.
А libbgi.a в ...\mingw\lib.



#include <graphics.h>

int main() {
int graphdriver = VGA ;
int graphmode = VGAHI;

initgraph (&graphdriver, &graphmode, "");

//line (500,350,200,300);
//closegraph();
return 0;
}




При попытке скомпилировать это получаю следующие :
D:\msys\1.0\mingw\bin>c++ asd.cpp
C:\DOCUME~1\ROCKET~1\LOCALS~1\Temp/cc8udaaa.o:asd.cpp:(.text+0x14c): undefined r
eference to `initgraph'
collect2: ld returned 1 exit status

В чём моя ошибка ?

Автор: volvo 24.08.2008 1:39

Цитата
Я добавил graphics.h и winbgim.h и в ...\mingw\include.
А libbgi.a в ...\mingw\lib.
Ну, скопировать-то ты скопировал файлы. А добавить к проекту библиотеки не забыл? Добавляешь libbgi.a, она тянет за собой еще 5 бмблиотек: libgdi32.a, libole32.a, libolepro32.a, libuuid.32.a и libcomdlg32.a

Вот когда все это добавишь, программа откомпилируется и слинкуется. Работоспособность не проверял.

Автор: renesko1 24.08.2008 1:48

Нескромный и глупый вопрос, где можно взять эти библиотеки?
Заранее спасибо.

Автор: volvo 24.08.2008 2:07

А что, в папке \lib у тебя их нет? Значит, у тебя "неправильный мед" (С), в смысле, неполная установка MinGW... В моей есть все выше перечисленное.

Автор: renesko1 24.08.2008 2:11

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

Автор: volvo 24.08.2008 2:44

Ты чем компилируешь? Из командной строки? Значит, в эту самую строку при вызове линкера добавь

-llibbgi -llibgdi32 -llibole32 -llibolepro32 -llibuuid -llibcomdlg32
, чтобы линкер мог слинковать твой проект со всеми этими библиотеками...

Я пользуюсь http://www.codeblocks.org/, там все добавляется через меню Project -> Build Options -> Linker Settings -> Add

Автор: renesko1 24.08.2008 3:06

Код

D:\msys\1.0\mingw\bin>g++ asd.cpp  -llibbgi -llibgdi32 -llibole32 -llibolepro32
-llibuuid -llibcomdlg32
..\lib\gcc\mingw32\3.4.5\..\..\..\..\mingw32\bin\ld.exe: cannot find -llibbgi
collect2: ld returned 1 exit status

libbgi - лежит в ...\mingw\lib.
Хм... Где моя ошибка?

Автор: volvo 24.08.2008 5:11

Очень похоже на то, что у тебя PATH не содержит пути к MinGW. Тогда что-то типа:

Код
D:\msys\1.0\mingw\bin>g++ -o main asd.cpp "D:\msys\1.0\mingw\lib\libbgi.a" "D:\msys\1.0\mingw\lib\libgdi32.a" "D:\msys\1.0\mingw\lib\libole32.a" "D:\msys\1.0\mingw\lib\libolepro32.a" "D:\msys\1.0\mingw\lib\libuuid.a" "D:\msys\1.0\mingw\lib\libcomdlg32.a"
должно сработать.

Автор: renesko1 24.08.2008 18:18

А можно дописать пути path к mingw ?

Автор: renesko1 24.08.2008 18:57

Всё я скачал code::blocks добавил библиотеки и всё стало воистину хорошо.
Что то я вчера тормозил, ещё раз спасибо volovo )

Автор: renesko1 25.08.2008 21:47

Можно ли и как перегрузить операцию индексирования (в матрице)[][] ? Мне нужен обьвление функции.
Заранее спасибо.

Автор: volvo 25.08.2008 22:09

Описание матрицы приведи, чтоб было понятно, чего именно ты хочешь... В общем случае - используй proxy-классы.

Автор: renesko1 25.08.2008 23:26



template<class T>
class matrix {
private :
vector<T>* data ;
int len, wid ;
public :
matrix (int l, int w);
matrix (const matrix& rhs);

int getLen () const {return len ;};
int getWid () const {return wid ;};

T& ind (int index1, int index2) ; // <-----------
const T& ind (const int& index1, const int& index2) const; //<--------------Заменить на оператор индексации

};



Я представляю матрицу через вектор. Мне так, допустим, хочется ). Как надо сделать ?

Автор: volvo 26.08.2008 0:34

Ну, раз хочется... smile.gif

Вот так, к примеру:

template <class T>
class matrix {

private:
class proxy {
vector<T> *p_data;
int p_x;

public:
void init(vector<T>* ptr) {
p_data = ptr;
}
proxy& operator() (int x) {
p_x = x;
return *this;
}
T& operator [] (int y) {
return p_data[p_x][y];
}

};

protected:
int len, wid;

vector<T> *data;
mutable proxy pproxy; // <--- не забудь

public :
// собственно, вот и индексация...
proxy& operator[] (int x) {
return pproxy(x);
}

matrix (int l, int w) {
// здесь инициализация data

pproxy.init(data); // <--- !!!
}

// дальше - все твои определения, что и было...
// только правильно выдели память под vector-ы, reserve не забудь
};


// вызывать вот так:
int main() {
matrix<int> mx(5, 5);

mx[1][2] = 3;
mx[3][1] = 7;

cout << mx[1][2] << endl;
cout << mx[3][1] << endl;

return 0;
}

Автор: renesko1 26.08.2008 3:37

Спасибо... Просто, я решил змейку сделать на С++, заодно набить руку шаблонами, классами и прочими интерессными вещами.

Автор: renesko1 26.08.2008 23:34

1 вопрос: как в с++ заменить следующую конструкцию


if keypressed then
begin
key := readkey ;
case ord(key) of
1 :
2 :
...



заранее спасибо.



Автор: volvo 26.08.2008 23:49

И что эта конструкция делает на Паскале? Какие кнопки отлавливает?

В общем виде - вот так:

    int key;
if(kbhit()) {
switch(key = getch()) {
case '1': // нажата '1'
// обрабатываем
break;
case '2':
// обрабатываем
break;
}
}


Автор: renesko1 27.08.2008 0:14

Хм... А если я хочу отловить нажатие курсорных клавиш ?

Добавлено через 15 мин.
И ещё 1 вопрос .
Как сделать задержку (delay()-pas) ?

Автор: volvo 27.08.2008 0:56

Цитата
А если я хочу отловить нажатие курсорных клавиш ?

Ну, так лови:
    int key;
if(kbhit()) {
if(!(key = getch())) {
switch(getch()) {
case 72: // нажата "вверх"
break;
case 80: // нажата "вниз"
break;
}
}
else {
switch(key) {
// нерасширенные символы
...
}
}
}



Цитата
Как сделать задержку
В graphics.h (в том, на который я приводил ссылку выше) есть функция delay()

Автор: renesko1 27.08.2008 14:21

Спасибо good.gif

Автор: guf 29.08.2008 23:11

Добрый вечер. Есть вопросик. Как перевести DWORD в CString? В переменной DWORD хранится IP адрес.

Автор: volvo 30.08.2008 0:02

Как-нибудь вот так

CString get_str(DWORD ip)
{
unsigned char first = (ip >> 24) & 0xFF;
unsigned char second = (ip >> 16) & 0xFF;
unsigned char third = (ip >> 8) & 0xFF;
unsigned char fourth = ip & 0xFF;

CString s;
s.Format (L"%u.%u.%u.%u", first, second, third, fourth);
return s;
}
?

Автор: guf 30.08.2008 0:32

Использую компонент IP Addres Control. Ввожу IP, например 127.0.0.1. Почему-то при дебаге 0.0.0.0 выдает когда ставлю тоску останова.

и еще:
s.Format (L"%u.%u.%u.%u", first, second, third, fourth);
заменил на:
s.Format ("%u.%u.%u.%u", first, second, third, fourth);

выдает ошибку у меня, в свойствах проекта Character Set стоит как Use Multi-Byte Character Set
может из-за L перед "%u.%u.%u.%u" ?

Автор: volvo 30.08.2008 4:32

А вот тут я тебе ничем помочь не смогу - я не пользуюсь компилятором от MS, тем более тем, чего нет в Стандарте языка (просто знаю, что в CString есть метод Format, и представляю, для чего он нужен). Если бы был обычный std::string, то можно было бы проверить на любом другом компиляторе, а так... У меня конечно есть VC Express Edition, однако MFC он не поддерживает.

Автор: guf 3.09.2008 2:30

Все равно спасибо! Буду пробовать!

Автор: blackhard 25.09.2008 23:34

Неподскажите где можно почитать про тип TCHAR (его структуру) нашед статью в MSDNе ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.ENTSERV.v10.en/mapi/html/34762d86-22bc-4dad-82e5-e30203b7771e.htm
и насколько я понял это для того чтоб можно было работать и с ANSI кодировкой и с UNICODE в 1м типе?Может кто может разъяснить поподробнее...........

Автор: volvo 25.09.2008 23:53

На самом деле никакой структуры этот тип не имеет, это просто синоним:

#ifdef UNICODE
typedef WCHAR TCHAR;
#else
typedef char TCHAR;
#endif

(таким образом, в Юникодных проектах под TCHAR подразумевается WCHAR, а в не-Юникодных - простой char...)

Автор: blackhard 25.09.2008 23:55

Цитата(volvo @ 25.09.2008 20:53) *

На самом деле никакой структуры этот тип не имеет, это просто синоним:

#ifdef UNICODE
typedef WCHAR TCHAR;
#else
typedef char TCHAR;
#endif

(таким образом, в Юникодных проектах под TCHAR подразумевается WCHAR, а в не-Юникодных - простой char...)

Спасибо большое smile.gif !