Не совсем. При разработке типа, поскольку класс или структура не должны управляться потребностью сохранить его в наборах:) Необходимо посмотреть на 'семантику', необходимую
проблема, которую Вы видите, должно оценить семантику типа. Каждая переменная типа значения / ссылка является новым экземпляром. То, когда Вы говорите
Struct obItem = MyList[1];
, что происходит, - то, что новый экземпляр структуры создается, и все участники копируются один за другим. Так, чтобы у Вас был клон MyList[1] т.е. 2 экземпляров. Теперь при изменении obItem он не влияет на оригинал.
obItem.Name = "Gishu"; // MyList[1].Name still remains "peter"
Теперь терпят меня в течение 2 минут здесь (Это требует времени для проглатывания.. это сделало для меня:) При реальной необходимости в структурах, которые будут сохранены в наборе и изменены как Вы обозначенный в Вашем вопросе, необходимо будет заставить структуру представить интерфейс ( Однако, это приведет к упаковке ). Можно тогда изменить фактическую структуру через интерфейсную ссылку, которая относится к помещенному в коробку объекту.
следующий фрагмент кода иллюстрирует то, что я просто сказал выше
public interface IMyStructModifier
{
String Name { set; }
}
public struct MyStruct : IMyStructModifier ...
List<Object> obList = new List<object>();
obList.Add(new MyStruct("ABC"));
obList.Add(new MyStruct("DEF"));
MyStruct temp = (MyStruct)obList[1];
temp.Name = "Gishu";
foreach (MyStruct s in obList) // => "ABC", "DEF"
{
Console.WriteLine(s.Name);
}
IMyStructModifier temp2 = obList[1] as IMyStructModifier;
temp2.Name = "Now Gishu";
foreach (MyStruct s in obList) // => "ABC", "Now Gishu"
{
Console.WriteLine(s.Name);
}
HTH. Хороший Вопрос.
Обновление: @Hath - у Вас был я работающий, чтобы проверить, пропустил ли я что-то что простой. (Это было бы непоследовательно, если свойства метода set не делают и методы сделали-.Net вселенная все еще сбалансирована:)
Метод установщика не работает
, obList2[1] возвращает копию, состояние которой было бы изменено. Исходная структура в списке остается неизмененной. Таким образом, Набор через интерфейс, кажется, только способ сделать это.
List<MyStruct> obList2 = new List<MyStruct>();
obList2.Add(new MyStruct("ABC"));
obList2.Add(new MyStruct("DEF"));
obList2[1].SetName("WTH");
foreach (MyStruct s in obList2) // => "ABC", "DEF"
{
Console.WriteLine(s.Name);
}
Нет, MSVC не имеет эквивалента -isystem
.
посмотрите на вывод команды cl /? :
/ wd отключить предупреждение n
/ мы рассматриваем предупреждение n как ошибку
/ дважды выдает предупреждение n один раз
/ w устанавливает уровень предупреждения 1-4 для n
. Обратите внимание, что это отключает предупреждения для всего вашего проекта; Я помню, что при использовании Qt я бы предпочел изменить его основной заголовок с помощью #pragma warning disable и снова включить в конце, чтобы я мог видеть все предупреждения для моего собственного источника.
Edit автор редактировал свой вопрос, обновленный ответ: нет способа получить ваш код с предупреждениями и код Qt без предупреждений с использованием флагов компилятора: как вы собираетесь сообщить компилятору, что является «вашим» кодом?
Обратите внимание, что указанные выше флаги могут быть применены к файлу уровень также, так что это позволит вам отключить предупреждения только для тех файлов, в которые вы включаете заголовки Qt, но что по-прежнему означает, что вы не можете видеть их для своего собственного кода в этих файлах.
Так что я остаюсь с ответ выше; это не совсем красиво, но я уверен, что это единственный способ: использовать #pragma в начале и в конце заголовка (ов) Qt. Либо измените заголовки Qt (даже более уродливо), либо выберите менее инвазивный способ, например:
//your source/header file
#include "shutuppqt.h"
#include <QString>
#include "enableallwarnings.h"
пример "shutuppqt.h"
#ifdef MSVC
#pragma warning ( disable : 4222 ) //or whatever warning Qt emits
#else
//....
#endif
пример "enableallwarnings.h"
#ifdef MSVC
#pragma warning ( enable : 4222 ) //or default instead of enable
#else
//....
#endif