Я пытался проверить, если множественное определение класса друга в разных .cpp
файлы будут работать. Для этого я определил основной класс внутри main_class.hpp
файл:
class main_class
{
private:
int a;
int b;
int gimme_a()
{
return a;
}
public:
main_class(int a, int b) : a(a), b(b) {}
int gimme_b()
{
return b;
}
friend class main_class_friend;
};
Тогда я определил main_class_friend
два раза, сначала в течение main_friend_class1.cpp
файл:
class main_class_friend
{
main_class c;
public:
main_class_friend() : c(10, 10) {}
int gimme_a()
{
return c.gimme_a();
}
int gimme_b()
{
return c.gimme_b();
}
};
и соответствующая публичная тестовая функция:
void test1()
{
main_class_friend ff;
std::cout << "Gimme a: " << ff.gimme_a() << " and gimme b: " <<
ff.gimme_b() << std::endl;
}
а потом я определил второй main_class_friend
в main_friend_class2.cpp
и соответствующая публичная тестовая функция:
class main_class_friend
{
private:
main_class ca;
int c;
public:
main_class_friend() : ca(9 ,9), c(11) {}
int gimme_a()
{
return ca.gimme_a();
}
int gimme_b()
{
return ca.gimme_b();
}
int gimme_c()
{
return c;
}
};void test2()
{
main_class_friend ff;
std::cout << "Gimme a: " << ff.gimme_a() << " and gimme b: " << ff.gimme_b()
<< " and gimme c: " << ff.gimme_c() << std::endl;
}
Наконец я позвонил test1
а также test2
функция внутри основного:
int main()
{
test1();
test2();
return 0;
}
скомпилировал программу (без ошибок g++
) и запустить его. Выход был:
Gimme a: 9 and gimme b: 9
*** stack smashing detected ***: ./a.out terminated
Aborted (core dumped)
Что действительно странно для меня, так это a
а также b
были инициализированы конструктором внутри main_friend_class2.cpp
а не тот из main_friend_class1.cpp
где test1
функция определена.
Затем я обнаружил, что разбивка стека может быть легко отлажена, когда программа компилируется с -fstack-protector
флаг. Поэтому я скомпилировал его еще раз, и результат программы был:
Gimme a: 9 and gimme b: 9
Gimme a: 9 and gimme b: 9 and gimme c: 11
так что больше не будет проблем с разбивкой стека, но оба test1
а также test2
функции используют конструктор из main_friend_class2.cpp
файл.
Что здесь происходит? Я не понимаю Почему возникает ошибка разрушения стека, если нет переполнения буфера, потому что буфер не используется?
Мой второй вопрос: есть ли способ определить несколько раз main_class_friend
но использовать их в разных файлах, чтобы сделать их «закрытыми» для файла, внутри которого используется класс?
Задача ещё не решена.
Других решений пока нет …