LINUX.ORG.RU

Два объекта, один класс...

наш бухгалтер пи[пипипи]ас :)

Как обратится к приватам второго...

используя friend class, очевидно, только я не пойму как это соотносится с кодом который Вы привели

Это выдает ошибку. Что здесь не так?

; после struct поставь

struct Struct{
    int a;
    int b;
};

shty ★★★★★
()
Ответ на: комментарий от namezys

У меня сейчас его нету. Но при компиляции gcc4.3 Выдавал ошибку именно на предпоследней строчке.

Andaril ★
() автор топика

Вы просто скажите если такое вообще может работать. Представим. Что это единственная функция кроме конструтора и деструктора... Ну фунции которя добовляет элементы в список.

Andaril ★
() автор топика
Ответ на: комментарий от Andaril

Вы неправильно используете std::list::merge, для того чтобы его использовать Вам надо определить отношения меньше/больше между элементами списка

shty ★★★★★
()
Ответ на: комментарий от shty

для POD-типов это отношение выводится по-умолчанию, а вот как между собой структуры соотносятся - это Вы должны определить

shty ★★★★★
()
Ответ на: комментарий от shty

озвучу сказанное)

class foo {
	private:
		struct Struct{
			int a;
			int b;
			bool operator<(const Struct& s)
			{ // пример
				if (a < s.a)
					return true;
				else if (a == s.a && b < s.b)
					return true;
				else
					return false;
			}
		};
		list<Struct> mylist;

	public:

		void merge_that_list(list<Struct> s1) {
			mylist.merge(s1);
		}
};

backbone ★★★★★
()
Ответ на: комментарий от Andaril

> Извини, а что произойдет если true? XD
честно, не понял юмора, вот пример

#include <iostream>

#include <list>
#include <string.h>

using namespace std;

class foo {
	private:
		struct Struct{
			int a;
			int b;
			bool operator<(const Struct& s)
			{ // пример
				if (a < s.a || (a == s.a && b < s.b))
					return true;
				else
					return false;
			}
		};
		list<Struct> mylist;

		void merge_that_list(list<Struct> s1)
		{
			mylist.merge(s1);
		}

	public:

		void bar()
		{
			list<Struct> l;
			Struct s;
			memset(&s, 0, sizeof(s));
			l.push_back(s);
		}
};



int main()
{
	foo f;
	f.bar();

	return 0;
}

backbone ★★★★★
()
Ответ на: комментарий от Andaril

merge выполняет операцию слияния, не сортировки!
если эта операция применяется к отсортированным массивам, то доказано, что результирующий массив будет строго отсортирован!
пример:

#include <iostream>

#include <list>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

using namespace std;

class foo {
	private:
		struct Struct{
			int a;
			int b;
			bool operator<(const Struct& s)
			{ // пример
				if (a < s.a || (a == s.a && b < s.b))
					return true;
				else
					return false;
			}
		};
		list<Struct> mylist;

		void merge_that_list(list<Struct> s1)
		{
			mylist.sort();
			s1.sort();
			mylist.merge(s1);
		}

	public:

		void bar()
		{
			list<Struct> l;
			Struct s;
			memset(&s, 0, sizeof(s));
			for (int i = 0; i < 8; i++) {
				s.a = rand() % 16;
				s.b = rand() % 16;
				l.push_back(s);
			}
			merge_that_list(l);
		}

		void bar2()
		{
			for (list<Struct>::const_iterator it = mylist.begin(); it != mylist.end(); it++)
				printf("a = %8d  b = %8d\n", it->a, it->b);
		}
};



int main()
{
	foo f;
	f.bar();
	f.bar2();

	return 0;
}
Здесь происходит сортировка массивов, а потом их слияние. Операция сортировки двух массивов быстрее сортировки большого массива. Слияние - операция менее затратная и выполняется за O(n).
      void merge_that_list(list<Struct> s1)
      {
         mylist.sort();
         s1.sort();
         mylist.merge(s1);
      }

backbone ★★★★★
()
Ответ на: комментарий от deterok

А в чем смыл добавлять классу себя же во френды?

Andaril ★
() автор топика
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.