Мне кажется, философия программирования - понятие очень неоднозначное. Это примудрости проектирования архитектуры приложений вне зависимости от языка или же кунг-фу на низком уровне с простыми инструментами? Си все-таки ближе ко второму, ибо язык прост, как дубина, хотя использовать его в реальном мире сложно. При этом, языки высокого уровня, вроде Java или C#, позволяют абстрагироваться от любых премудростей и конкретики реализации, посвящая себя теории ООП, ФП и т.п. *С++ имеет регулируемую степень красноглазия, так что я пока его обойду*
Слабая связь компонентов имеет смысл в крупных, развивающихся проектах и универсальных модулях, а для цельных разработок это часто лишние трудозатраты и избыточная гибкость, выраженая излишним кодом. (Тут можно до хрипоты спорить с людьми, утверждающими что всегда нужно рассчитывать на возможность масштабирования, повторное использование кода, локализации приложения и прочее нужное в случае коммерческого успеха).
Всякого рода MVC (на сколько я знаю, довольно популярная парадигма для фреймворков php) на полную катушку используют подобную абстракцию. Получается, вы всю абстракцию используете косвенно =) Если бы было желание писать свой фреймворк (или, скажем так, приложение "с нуля"), вполне очевидно столкнулись бы с этими-самыми абстрактными интерфесами-классами.
Не помогает. Были подозрения, что вмешиваются предкомпилированные заголовки - отключил, не помогло.
Что странно, работает с предварительным объявлением типа диалога:
/* Test.h */
#pragma once
#include "afxwin.h"
#include "Project_nameDlg.h"
class CProject_nameDlg;
stuct Test {
CProject_nameDlg* ptr_;
Test(CProject_nameDlg* ptr) : ptr_( ptr ) { }
};
При этом видит даже все члены, компилируется и выполняется как нужно, без этого - считает CProject_nameDlg идентификатором, а не типом.
Что значит об одном и том же? Какой же креатив нужен от учебников по С++?
От себя бы еще практическую часть учебника Павловской порекомендовал, на С-подмножество там есть достойные задания.