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
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.