virtual
требуется реализация. Объявление деструктора по-прежнему требует от вас определения (в отличие от обычной функции):
struct X
{
virtual ~X() = 0;
};
struct Y : X
{
~Y() {}
};
int main()
{
Y y;
}
//X::~X(){} //uncomment this line for successful definition
Это происходит потому, что деструкторы базового класса вызывается, когда объект уничтожается неявно, поэтому требуется определение.
virtual
методы должны быть реализованы или определены как чистые. Это похоже на методы не virtual
без определения, с добавлением аргументов, которые генерирует чистая декларация dummy vtable, и вы можете получить ошибку компоновщика без использования функции:
struct X
{
virtual void foo();
};
struct Y : X
{
void foo() {}
};
int main()
{
Y y; //linker error although there was no call to X::foo
}
Чтобы это сработало, объявите X::foo()
чистым:
struct X
{
virtual void foo() = 0;
};
virtual
Некоторые члены должны быть определены, даже если они явно не используются:
struct A
{
~A();
};
Следующие ошибки приведут к ошибке:
A a; //destructor undefined
Реализация может быть встроенной в самом определении класса:
struct A
{
~A() {}
};
или снаружи:
A::~A() {}
Если реализация вне определения класса, но в заголовке, методы должны быть отмечены как inline
, чтобы предотвратить множественное определение.
Все используемые методы-члены должны быть определены, если они используются.
struct A
{
void foo();
};
void foo() {}
int main()
{
A a;
a.foo();
}
Определение должно быть
void A::foo() {}
static
. Члены данных должны быть определены вне класса в единственная единица перевода: struct X
{
static int x;
};
int main()
{
int x = X::x;
}
//int X::x; //uncomment this line to define X::x
Инициализатор может быть предоставлен для элемента данных static
const
типа интеграла или перечисления в определении класса; однако odr-использование этого элемента по-прежнему потребует определения области пространства имен, как описано выше. C ++ 11 позволяет инициализировать внутри класса для всех членов static const
данных.
Я хочу иметь возможность запрашивать статические .html-файлы, которые находятся в папке ~ ~ / Views.
blockquote>Вы не можете. В этой папке есть файл web.config, который явно запрещает доступ к нему из любого файла. Если вы хотите иметь доступ к файлам с клиента, эти файлы не должны помещаться в папку
Views
, которая имеет особое значение в ASP.NET MVC.У вас может быть папка
~/Static
где вы можете разместить ваши HTML-файлы. И затем войдите в него так:http://example.com/yourapplicationname/static/foo.html
Чтобы разрешить такие файлы, как js и html в папке «Виды», отредактируйте файл web.config в видах-папке:
<system.webServer>
<handlers>
<add name="JavaScriptHandler" path="*.js" verb="*"
preCondition="integratedMode" type="System.Web.StaticFileHandler" />
<add name="HtmlScriptHandler" path="*.html" verb="*"
preCondition="integratedMode" type="System.Web.StaticFileHandler" />
<remove name="BlockViewHandler"/>
<add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
</handlers>
Другой альтернативный вариант заключается в том, чтобы вставить метод действия в любой из желаемых контроллеров для обслуживания html-файла
public ActionResult MyHtml()
{
var result = new FilePathResult("~/Views/HtmlPage1.html", "text/html");
return result;
}
Доступ к html как http: // yoursite / controller / MyHtml . Вы можете расширить этот метод действий, чтобы принять имя файла html в качестве параметра method / querystrign и отобразить файл во время выполнения, например, что-то вроде этого.
public ActionResult MyHtml(string htmlPageName)
{
var result = new FilePathResult($"~/Views/{htmlPageName}.html", "text/html");
return result;
}
Я хочу иметь возможность запрашивать статические .html-файлы, которые находятся в папке ~ / Views.
blockquote>Ну, вы можете. Отмеченный ответ не совсем корректен, хотя он дает решение.
Правильная аргументация в отмеченном ответе правильная: в папке «Представления», которая препятствует файлам, задан параметр web.config (параметр BlockViewHandler) для доступа непосредственно. Он предназначен для защиты представлений в Asp.Net MVC. Но если вы задали вопрос об обслуживании этих файлов напрямую, то у вас, вероятно, есть веские основания для этого, например, с использованием частичных представлений AngularJS (как в нашем случае), где мы не хотим дублировать папку представлений со странными именами.
Итак, вот очень простая настройка, которую вы можете сделать в файле web.config, найденном в папке «Представления», без ущерба для безопасности ваших просмотров asp.net mvc. Это сохранит файлы .cshtml как обычно, но оставит только ваши .html-файлы.
Измените это
<add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
- to -
<add name="BlockViewHandler" path="*.cshtml" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />