Поиск:

Ответ в темуСоздание новой темы Создание опроса
> совпадение имен функций. 
:(
    Опции темы
mrgloom
Дата 16.6.2011, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



пытаюсь использовать функцию
GetClientRect
в одном месте она используется нормально и определена в afxwin.h
Код

void GetClientRect(LPRECT lpRect) const;

в другом месте она не хочет использоваться т.к. определена в WinUser.h
Код

WINUSERAPI
BOOL
WINAPI
GetClientRect(
    __in HWND hWnd,
    __out LPRECT lpRect);


и соответственно пишет  error C2660: 'GetClientRect' : function does not take 1 arguments.


как можно указать в одном .cpp файле использовать функции с одним и тем же именем,но определенные в разных .h файлах?


зачем явно указывать #pragma once?     почему это не стоит по дефолту?  когда может потребоваться включение хедера несколько раз?
PM MAIL   Вверх
bsa
Дата 16.6.2011, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: нет
Всего: 196



Цитата(mrgloom @ 16.6.2011,  10:19)
пытаюсь использовать функцию
GetClientRect
в одном месте она используется нормально и определена в afxwin.h
Код

void GetClientRect(LPRECT lpRect) const;

в другом месте она не хочет использоваться т.к. определена в WinUser.h
Код

WINUSERAPI
BOOL
WINAPI
GetClientRect(
    __in HWND hWnd,
    __out LPRECT lpRect);


и соответственно пишет  error C2660: 'GetClientRect' : function does not take 1 arguments.


как можно указать в одном .cpp файле использовать функции с одним и тем же именем,но определенные в разных .h файлах?

В первом случае, если у тебя компилируется, то GetClientRect это метод класса.
Во втором случае, скорее всего внешняя функция.
Цитата(mrgloom @ 16.6.2011,  10:19)
зачем явно указывать #pragma once?     почему это не стоит по дефолту?
#pragma once - это нестандартное расширение. Правильно делать стражи включения:
Код
#ifndef HEADER_NAME_H
#define HEADER_NAME_H
//....
#endif
А потом, включением занимается препроцессор. Он довольно тупой (по идее). Ты сказал ему сделать инклюд, он его сделает. Сейчас все осталось лишь из-за совместимости с языком С, которые был создан очень давно. Когда компьютеры были большими и медленными, а программы маленькими.
Цитата(mrgloom @ 16.6.2011,  10:19)
когда может потребоваться включение хедера несколько раз?

см. boost::preprocessor
PM   Вверх
mrgloom
Дата 16.6.2011, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



CWnd::GetClientRect(&clientRect);
попробовал так не получается пишет (в первом случае работает, а в другом нет)
: error C2352: 'CWnd::GetClientRect' : illegal call of non-static member function
1>        c:\program files\microsoft visual studio 9.0\vc\atlmfc\include\afxwin.h(2270) : see declaration of 'CWnd::GetClientRect'

опять же 
this->GetClientRect(&clientRect);
в первом случае работает, а во втором пишет : error C2039: 'GetClientRect' : is not a member of 'CMyClass'

наверно потому что в 1 случае я вызывал 
class CtestView : public CView

void CtestView::OnDraw(CDC* /*pDC*/)
{
    //GetClientRect
}

а во втором случае
bool CMyClass::Draw( CDC& dc)
{
    //GetClientRect
}

т.е. CMyClass не унаследован от CView и поэтому наверно ошибка, но как вызывать нужные мне функции прямо из CMyClass::Draw( CDC& dc)?
не пашут GetDC,ReleaseDC,GetClientRect.


вообщем там такая иерархия 
class СViewClass: public CScrollView

void СViewClass::OnUpdate()
{
      //вызов функции Draw , которая bool CMyClass::Draw( CDC& dc)
}


Это сообщение отредактировал(а) mrgloom - 16.6.2011, 11:37
PM MAIL   Вверх
bsa
Дата 16.6.2011, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: нет
Всего: 196



Цитата(mrgloom @  16.6.2011,  11:24 Найти цитируемый пост)
: error C2352: 'CWnd::GetClientRect' : illegal call of non-static member function

Если бы ты знал английский, то бы понял: "неверный вызов нестатического метода". Только статические методы можно вызывать так, как ты сделал. А обычные нужно вызывать с указанием объекта. Тебе нужно сделать класс наследником CWnd.

И вообще, завязывай с MFC. Оно уже мертво если не совсем, то практически. Обрати внимание на Qt (C++) или .Net (C#).
PM   Вверх
mrgloom
Дата 16.6.2011, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



Цитата(bsa @  16.6.2011,  11:36 Найти цитируемый пост)
Если бы ты знал английский, то бы понял: "неверный вызов нестатического метода". Только статические методы можно вызывать так, как ты сделал. А обычные нужно вызывать с указанием объекта. Тебе нужно сделать класс наследником CWnd.


да вообще то у меня нету такой функции в классе и класс не унаследован от CWnd.

как я написал выше иерархия как там все вызывается


class СViewClass: public CScrollView

void СViewClass::OnUpdate()
{
      //вызов функции Draw , которая bool CMyClass::Draw( CDC& dc)
}


с mfc не могу завязать, проект на нем уже большой и старый.


Это сообщение отредактировал(а) mrgloom - 16.6.2011, 11:44
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0452 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.