Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
h3mbr0
233 / 76 / 18
Регистрация: 12.03.2012
Сообщений: 327
#1

Как передать в функцию несколько аргументов, и другие глупые вопросы - C++

06.06.2012, 15:04. Просмотров 1896. Ответов 13
Метки нет (Все метки)

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

Итак:
1)Как передать в функцию неопределенное число аргументов, к примеру:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void Insert(int value) {
        ListItem *prev = NULL,
            *succ = first;
        while(succ != NULL && succ->item < value) {
            prev = succ;
            succ = succ->next;
        }
        ListItem *newItem = new ListItem(value, succ);
        if(succ == NULL)
            last = newItem;
        if(prev == NULL)
            first = newItem;
        else
            prev->next = newItem;
        itemsCount++;
    }
Что нужно сделать для реализации передачи нескольких(неопределенного кол-ва) аргументов функции Insert? к примеру CList::Insert(1,2,3,4,5);

2)Можно ли наследовать сразу несколько классов (объеденять их)?

3)Есть ли разница при инициализации:
C++
1
2
3
4
class myClass {
public:
static int count=0;
};
и
C++
1
myClass::count=0
4)Каким образом можно создать таск(таймер)? К примеру что бы через 15 секунд выполнилась некая функция myFunc, при том что программа продолжала работать, а не засыпала дожидаясь истечения 15 секунд.

5)Какая разница при передачи например
C++
1
void myFunc(myClass &s)
и
C++
1
void myFunc(myClass *s)
путаюсь со ссылкоуказателеразыменовывателями

6) Какая разница между const *char, const char*? Насколько я понял разница между const char* и char const* нет, но что такое const *char? Насколько я понял(прочитал) это констатный указатель на строку, но как он используется, и корректен ли он вообще? ведь при компиляции вылезают аж 3 ошибки.

7)Когда используются extern и static? Насколько я понял (опять же где то прочитал) например extern int i; объявляет что то вроде прототипа, позволяющего обращаться к этому самому i. А static создает локальную переменную, невидимую другим объектам, и перекрывающую другие глобальные объекты, и все же везде написано по разному, и я до конца так и не понял для чего и когда нужно использовать эти ключевые.. эти слова вообщем

8)Как заставить компилятор(visual studio) компилировать под 64 разрядную систему? ибо он всегда лепит под x32

9)И наконец как высвободить память(удалить) из под переменных, объектов, выделенных не в куче, т.е.
если
C++
1
myClass *mySuperClass
удаляется
C++
1
delete mySuperClass
то как удалить
C++
1
myClass mySuperClass
?

Извиняюсь за не особо информативное название треда, и заранее благодарю за ответы
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2012, 15:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как передать в функцию несколько аргументов, и другие глупые вопросы (C++):

Передать в функцию с переменным числом параметров УКАЗАТЕЛИ на другие функции - C++
void sum(int first, ...) { void (*l)() = (&amp;first+1); //ведь там в стеке все аргументы l(); } вот в таком стиле..(это...

Как передать пути в качестве аргументов приложению? - C++
Здравствуйте. Как запускать приложения в дебагере VS с параметрами? Как передать пути приложению, запуская его другим приложением....

Не получается передать ссылку в функцию при разделении кода на несколько файлов - C++
В подключаемом файле parse.cpp находится функция и её объявление в parse.h int parse(Lexem &amp;lexer, In &amp;in) { int lev = 0; ...

Хочу передать в функцию несколько разнотипных массивов. Можно так делать? - C++
Хочу передать в функцию несколько разнотипных массивов. Можно так делать? Надо в функцию чар. передать несколько разных аргументов. ...

Как принять заранее неизвестное количество аргументов и передать их в конструктор? - C++
Допустим есть функция которая создает объект template&lt;typename T&gt; T* createObject(typename ...params) { return new...

Не могу разобраться как передать корректно передать массив из функции в функцию - C++
//--------------------------------------------------------------------------- #pragma hdrstop ...

13
g-h
67 / 67 / 1
Регистрация: 03.06.2012
Сообщений: 176
06.06.2012, 16:27 #2
Цитата Сообщение от h3mbr0 Посмотреть сообщение
1)Как передать в функцию неопределенное число аргументов
Использовать многоточие в параметрах функции
Код
int Insert(...);  // принимает неопределенное число аргументов
7) Переменная static инициализируется только один раз и если она в функции то при выходе не удаляется из памяти (она просто не видна.)

Все. Больше ничего не знаю

Добавлено через 5 минут
Цитата Сообщение от h3mbr0 Посмотреть сообщение
3)Есть ли разница при инициализации:Код C++
1
2
3
4 class myClass {
public:
static int count=0;
};
Так вроде бы нельзя инициализировать
Код
int myClass::count = 0;
1
h3mbr0
233 / 76 / 18
Регистрация: 12.03.2012
Сообщений: 327
06.06.2012, 16:40  [ТС] #3
Цитата Сообщение от g-h Посмотреть сообщение
Использовать многоточие в параметрах функции
Код
int Insert(...);  // принимает неопределенное число аргументов
это я понял.. но вот как их потом выловить?
7)
Так вроде бы нельзя инициализировать
Код
int myClass::count = 0;
да.. опечатался... и все же, почему нельзя инициализировать в классе?
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
06.06.2012, 16:52 #4
Цитата Сообщение от h3mbr0 Посмотреть сообщение
1)Как передать в функцию неопределенное число аргументов, к примеру:
http://cplusplus.com/reference/clibrary/cstdarg/va_list/

Цитата Сообщение от h3mbr0 Посмотреть сообщение
2)Можно ли наследовать сразу несколько классов (объеденять их)?
читай про множественное наследование

Цитата Сообщение от h3mbr0 Посмотреть сообщение
6) Какая разница между const *char, const char*? Насколько я понял разница между const char* и char const* нет, но что такое const *char? Насколько я понял(прочитал) это констатный указатель на строку, но как он используется, и корректен ли он вообще? ведь при компиляции вылезают аж 3 ошибки.
C++
1
2
3
4
5
6
7
8
9
10
11
12
char a, b;
const char* c = &a;
//*c = 'a'; //ошибка - указатель на константу
  c = &b;     //Ok
  
char * const d = &a;
//d = &b; //ошибка - константный указатель
 *d = 'a'; //Ok
 
const char* const e = &a;
//*e = 'a'; //ошибка - указатель на константу
//e = &b; //ошибка - константный указатель
Цитата Сообщение от h3mbr0 Посмотреть сообщение
8)Как заставить компилятор(visual studio) компилировать под 64 разрядную систему? ибо он всегда лепит под x32
в опциях проекта, если при установке студии поставили галку на установке компонентов для x64

Цитата Сообщение от h3mbr0 Посмотреть сообщение
9)И наконец как высвободить память(удалить) из под переменных, объектов, выделенных не в куче, т.е.
если
C++
1
myClass *mySuperClass
удаляется
C++
1
delete mySuperClass
myClass *mySuperClass удаляем delete только тогда когда выделяли память через new

Цитата Сообщение от h3mbr0 Посмотреть сообщение
то как удалить
C++
1
myClass mySuperClass
?
C++
1
2
3
{
    myClass mySuperClass;
} //выходим из области видимости и все созданные в блоке переменные "удаляются"
2
g-h
67 / 67 / 1
Регистрация: 03.06.2012
Сообщений: 176
06.06.2012, 16:58 #5
Вот примерчик. Правда он не везде правильно работает.
Первый аргумент показывает сколько цифр надо просуммировать. Их количество может быть разным
Код
int my_summ(int n, ...);  // возвращает сумму чисел. Их количество равно n


int _tmain(int argc, _TCHAR* argv[])
{
	cout << my_summ(3, 1,2,3) << endl;


	system("pause");
	return 0;
}

int my_summ(int n, ...)
{
	int rez = 0;

	for (int i=1; i<=n; i++)
		rez += *(&n + i);

	return rez;
}
1
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
06.06.2012, 17:10 #6
c эллимсисами лучше не связыватся. но если уж приспичило, то для этого есть спец средства:
http://www.cplusplus.com/reference/clibrary/cstdarg/va_start/
2
g-h
67 / 67 / 1
Регистрация: 03.06.2012
Сообщений: 176
06.06.2012, 17:16 #7
Можно вопрос? Вот эту ссылку дали http://cplusplus.com/ А есть ли такой сайт, но только на русском?
0
h3mbr0
233 / 76 / 18
Регистрация: 12.03.2012
Сообщений: 327
06.06.2012, 22:55  [ТС] #8
Цитата Сообщение от g-h Посмотреть сообщение
Можно вопрос? Вот эту ссылку дали http://cplusplus.com/ А есть ли такой сайт, но только на русском?
официального нет
А как насчет остальных моих вопросов?

Добавлено через 4 часа 5 минут
ап, еще один вопрос:
на что указывает this? по сути (по определнию) на текущий объект, но откуда ему известно какой объект текущий?
0
Nick Alte
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
06.06.2012, 23:02 #9
Цитата Сообщение от h3mbr0 Посмотреть сообщение
по сути (по определнию) на текущий объект, но откуда ему известно какой объект текущий?
Он указывает на объект, для которого вызван метод. На котором именно объекте метод вызван, известно там, где и когда этот вызов происходит. Адрес этого объекта передаётся в метод как скрытый параметр и называется this.
Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct Example {
    int a;
    void foo() {this->a = 0;}  // Можно было написать просто a = 0;
};
 
void bar(Example* This)
{
    This->a = 0;
}
 
int main()
{
    Example e;
    // Эти два вызова делают одно и то же, но в первом случае адрес e передаётся неявно через this
    e.foo();
    bar(&e);
}
2
h3mbr0
233 / 76 / 18
Регистрация: 12.03.2012
Сообщений: 327
06.06.2012, 23:28  [ТС] #10
А что начет 3, 4, 5, 7, и 9 вопроса?
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
06.06.2012, 23:48 #11
Цитата Сообщение от h3mbr0 Посмотреть сообщение
4)Каким образом можно создать таск(таймер)? К примеру что бы через 15 секунд выполнилась некая функция myFunc, при том что программа продолжала работать, а не засыпала дожидаясь истечения 15 секунд.
это системно зависимая возможность, если в винде то гуглите SetTimer(/*...*/)
в стандарном С++ таймера нет (пока что)

Цитата Сообщение от h3mbr0 Посмотреть сообщение
3)Есть ли разница при инициализации:
C++
1
2
3
4
class myClass {
public:
static int count=0;
};
и
C++
1
myClass::count=0
1-й код скомпилируется только компилятором поддерживающим новый стандарт - С++11
2-й код скомпилируется соответсвует прежним стандартам, а потому скомпилируется на более старых компиляторах


9-й вопрос я уже ответил в 4-м посту, что неясно?

Добавлено через 5 минут
Цитата Сообщение от h3mbr0 Посмотреть сообщение
5)Какая разница при передачи например

C++
1
void myFunc(myClass &s)
и
C++
1
void myFunc(myClass *s)
путаюсь со ссылкоуказателеразыменовывателями
что конкретно неясно?

Добавлено через 4 минуты
Цитата Сообщение от h3mbr0 Посмотреть сообщение
7)Когда используются extern и static? Насколько я понял (опять же где то прочитал) например extern int i; объявляет что то вроде прототипа, позволяющего обращаться к этому самому i. А static создает локальную переменную, невидимую другим объектам, и перекрывающую другие глобальные объекты, и все же везде написано по разному, и я до конца так и не понял для чего и когда нужно использовать эти ключевые.. эти слова вообщем
переменная объявленная как extern в одной еденице трансляции(читай файле), может использоватся в другой еденице трансляции, но в плюсах не принято использовать extern ибо это гораздо все усложняет
переменная объявленная как static наоборот видна только в одной еденице трансляции
переменная объявленная как static внутри функции сохраняет свое значение после выхода из функции
переменная объявленная как static внутри класса/структуры является общей для класса/структуры т..\е. её значение будет одинаковым для все объектов структуры/класса
1
h3mbr0
233 / 76 / 18
Регистрация: 12.03.2012
Сообщений: 327
07.06.2012, 12:46  [ТС] #12
Благодарю за исчерпывающие ответы
что конкретно неясно?
Ну на мой взгляд в обоих случаях передается адрес, и я не вижу разницы между указателем и ссылкой...
И не понимаю для чего иногда в коде объявляют ссылки(не в качестве аргумента, а в качестве переменной) и зачем это нужно
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
07.06.2012, 12:57 #13
Цитата Сообщение от h3mbr0 Посмотреть сообщение
Ну на мой взгляд в обоих случаях передается адрес, и я не вижу разницы между указателем и ссылкой...
это верно, но разница в том что:
1) указателю можно присвоить другой адрес
2) вместо указателя можно передать параметром 0
с ссылками такое не прокатит, вот и вся разница
2
g-h
67 / 67 / 1
Регистрация: 03.06.2012
Сообщений: 176
07.06.2012, 13:06 #14
Цитата из Стивен Дьюхерст. С++ Священные знания
Между ссылками и указателями существуют три основных различия: нулевых ссылок нет, все ссылки требуют инициализации и ссылка всегда установлена на объект, который ее инициализировал.
1
07.06.2012, 13:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.06.2012, 13:06
Привет! Вот еще темы с ответами:

Как вызвать функцию чужого приложения, как подменить значения аргументов функции? - C++
собственно вопрос первый: мне нужно каким то образом из своей программы/библиотеки вызвать функцию чужого приложения, естессно...

Передача неизвестного количества аргументов в функцию, как реализовать? - C++
Вот есть функция и в нее будут передаваться какие-то аргументы, причем заранее не известен их тип и количество (там уже в зависимости от...

Как передать указатель на функцию в функцию - C++
И как с ней работать?

Передать функции массив как несколько параметров - C++
Как передать функции массив как несколько параметров те где каждый элемент будет выступать как отдельный параметр


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru